2013-06-24 6 views
7

मैंने हाल ही में एक डिजिटल लॉजिक कोर्स लिया और सभी, और, और विभिन्न प्रकार के तर्क के बारे में सब कुछ सीखा। एक चीज जिसे हमने कवर नहीं किया था, जो प्रोग्रामिंग के लिए पूरी तरह से जरूरी है, if कथन है और इससे मुझे उत्सुकता है कि वे कैसे काम करते हैं।ट्रांजिस्टर के स्तर पर "if" कथन क्या है?

मेरा सबसे अच्छा अनुमान यह है कि यह केवल 2: 1 मल्टीप्लेक्सर होगा, और जैसे ही आप else कथन जोड़ते हैं, यह 4: 1 और 8: 1 हो जाता है लेकिन यह एक साधारण अवधारणा के लिए थोड़ा जटिल लगता है।

कोई भी जानता है कि if कथन वास्तव में क्या अनुवाद करता है?

+0

महान प्रश्न! हालांकि जटिल जवाब। आपको इसे पूरी तरह से समझने के लिए यह देखने की आवश्यकता है, मैं एक सरल उदाहरण लिखने, इसे संकलित करने, इसे डीबगर से जोड़ने, और इसके माध्यम से कदम उठाने की सलाह देता हूं, एक समय में एक निर्देश। – Wug

+0

@wug यह एक अच्छा विचार है, धन्यवाद। – Nealon

उत्तर

1

आप भूल रहे हैं कि प्रोग्राम अलग-अलग निर्देशों के रूप में निष्पादित किए जाते हैं, और (कम से कम सरल मामले में) निर्देश अनुक्रमिक रूप से निष्पादित होते हैं।

तो if (a + 4 > 5) के लिए एक अनुदेश एक रजिस्टर में a लोड होगा, एक और अनुदेश 4 जोड़ना होगा, एक और अनुदेश 5 लिए राशि की तुलना करेंगे। फिर एक निर्देश तुलना से "हालत कोड" का परीक्षण करेगा और या तो तुरंत निम्नलिखित निर्देश निष्पादित करेगा ("if शरीर" को निष्पादित करेगा) या स्मृति में किसी स्थान पर "कूदें" कई (या कई दर्जन) निर्देशों को दूर करें (" if शरीर ")।

वहां डिजिटल तर्क है, लेकिन यह प्रत्येक स्तर के निर्देश को निष्पादित करने का निर्णय लेते हुए निचले स्तर पर है।

+0

अच्छी तरह से कहीं भी रोमांचक के रूप में ... डर्न। धन्यवाद हालांकि – Nealon

+0

@Nealon - ऐसे कंप्यूटर हैं जो "सिलिकॉन के करीब" प्राप्त करते हैं। मैंने एक पर काम किया जहां अगले निर्देश का चयन एक प्रोग्राम करने योग्य तर्क सरणी द्वारा नियंत्रित किया गया था - अनिवार्य रूप से एक विशाल और/या सरणी। शर्तों में रखो और अगले निर्देश पते को प्राप्त करें, और अगर यह समझ में आता है तो विकल्प 10-20 अलग-अलग "शाखा लक्ष्यों" के बीच हो सकता है। –

+0

हाँ, हमने उस वर्ग में पीएलए के बारे में भी सीखा। यह दिलचस्प है, लेकिन मैं वास्तव में उम्मीद कर रहा था कि यह और अधिक दिलचस्प था। यह अनिवार्य रूप से (और मुझे पता है कि मैं शायद इसे नीचे डंबल कर रहा हूं) 'गोटो' बयान का एक समूह, है ना? – Nealon

1

एक उचित if कथन ट्रांजिस्टर तर्क से थोड़ा अधिक स्तर पर अनुवाद करता है। if कथन आम तौर पर सशर्त शाखाओं (कोई ऑप्टिमाइज़ेशन नहीं मानते) के रूप में लागू होते हैं, या तो डिफ़ॉल्ट राशि से कार्यक्रम काउंटर को बढ़ाते हैं या शाखा में निर्दिष्ट मूल्य पर सेट करते हैं, इस शर्त के आधार पर कि क्या स्थिति सही या गलत (आमतौर पर 1 या 0) का मूल्यांकन करती है।

0

if एक प्रोग्रामिंग भाषा के भीतर एक नियंत्रण प्रवाह संचालन है, डिजिटल तर्क में व्यक्त करने योग्य अवधारणा नहीं। यदि आपकी कक्षा jump जैसे असेंबली निर्देशों से जुड़ी मशीनरी को कवर करती है (मुझे यकीन नहीं है कि मैंने कभी यह सीखा है), तो if कथन से बाहर किया गया है।

-1

उपरोक्त अन्य लोगों ने कहा है कि तर्कसंगत तुलनाकर्ता हैं जो आखिरकार इन निर्णयों को बनाते हैं। डिजाइन आवश्यकताओं (शक्ति, क्षेत्र, स्विंग, घड़ी या नहीं, ect।) के आधार पर तुलनित्रों के विभिन्न कार्यान्वयन का एक टन है। तुलनित्र कई सीएमओएस एनएमओएस/सीएमओएस द्वार से बने होते हैं।

तुलनाकर्ताओं के लिए विकिपीडिया पृष्ठ देखें, और गतिशील लेटे हुए तुलनित्र को देखें। दुर्भाग्य से एक पोस्ट करने के लिए मेरे पास पर्याप्त प्रतिनिधि नहीं है।

यह गतिशील लेटेड तुलनित्र का एक उदाहरण है। यदि कार्यान्वयन उच्च या निम्न सक्रिय है, तो सिस्टम दो मानों की तुलना करने और विवरण का मूल्यांकन करने के लिए आर्किटेक्चर को यहां देखेगा।

1

यह थोड़ी देर के बाद से मैंने कंप्यूटर आर्किटेक्चर क्लास लिया है, इसलिए मुझे क्षमा करें यदि मैं इस जवाब के साथ थोड़ा अस्पष्ट हूं।

आपके कंप्यूटर निष्पादित करने वाले सभी निर्देश निर्देश स्मृति से आते हैं, और मेरा मानना ​​है कि निष्पादन के लिए निर्देश के पते का प्रतिनिधित्व करने वाला एक संख्या है।

सामान्य निर्देश में कमांड कोड के लिए एक सेक्शन, 1 और सामान्यतः 2 स्रोत रजिस्टरों के लिए अनुभाग, गंतव्य रजिस्टर और कुछ अन्य सामान हैं जिन्हें मुझे 4 से अधिक वर्षों तक नहीं सोचना पड़ा है।

वैसे भी, कमांड कोड में से एक सामान्य रूप से एक सशर्त कूद है, और यदि आप समझ सकते हैं कि आपका डेटा पथ नियमित RAM में मूल्यों को कैसे संग्रहीत/पुनर्प्राप्त करता है, तो यह तर्क को संशोधित करने के लिए उस तर्क को विस्तारित करना मुश्किल नहीं होना चाहिए या तो एक शाब्दिक मूल्य, या मूल्य के लिए एक विशेष रजिस्टर में संग्रहीत है, चाहे एक और शाब्दिक मूल्य/रजिस्टर मूल्य के आधार पर करने के लिए अनुदेश का पता करने के लिए 0

enter image description here

1

बयान तो बराबर है, और अन्य सभी नियंत्रण प्रवाह बयान, कर रहे हैं सशर्त कूद के रूप में तर्क स्तर पर लागू किया गया।

जब आप इस तरह बयान करता है, तो एक का उपयोग करें,:

int a = 1, b = 0 
if (a > b) 
{ 
    ... 

जाहिर है, किसी भी स्मार्ट संकलक इस बाहर अनुकूलित करेंगे। हम विशेष रूप से संभव के रूप में गूंगा हो सकता है और शब्दशः निर्देश उत्पन्न करने के लिए हमारे संकलक हिदायत है, तो हम इसे से बाहर निम्नलिखित की तरह कुछ मिल जाएगा:

my_if_statement: 
    CMP eax, ebx # intrinsically works by subtracting ebx from eax 
         # eax and ebx are not changed, but the arithmetic flags are 

         # if it was greater, jump to greater label 
    JG my_if_statement_was_true 

         # if it wasn't greater, we get here 
my_if_statement_was_false: 
         # do something 
         # we're now done, so jump to the end of the statement 
    J  my_if_statement_end 

my_if_statement_was_true: 
         # do something else 
         # now we're done with the if statement 
my_if_statement_end: 
         # program continues 

इन विधानसभा निर्देश, सीधे करने के लिए, जिनमें से प्रत्येक (लगभग) का अनुवाद कर रहे हैं मशीन कोड opcodes। प्रोसेसर लोडिंग और लांचिंग निर्देशों की प्रक्रिया का समर्थन करने के लिए अतिरिक्त सामान का एक गुच्छा करता है, जो यहां प्रासंगिक है। प्रोग्राम काउंटर (बाद में पीसी रजिस्टर के रूप में संदर्भित) नामक एक विशेष रजिस्टर है, जो प्रोसेसर निष्पादित करने वाले अगले ऑपोड के स्थान को ट्रैक करता है।

  1. सबसे पहले, सीएमपी निर्देश पहले से दूसरे ऑपरेंड को घटा देता है, और परिणाम को त्याग देता है। हालांकि, FLAGS रजिस्टर अंकगणितीय संचालन के परिणामों के साथ अद्यतन किया जाता है।
  2. फिर, जेजी निर्देश जांचता है कि FLAGS रजिस्टर में ग्रेटर ध्वज सेट है या नहीं। चूंकि यह हमारे उदाहरण में है (याद रखें कि 1> 0), यह एक कूद करता है।
  3. कूद निर्देश प्रोग्राम काउंटर (पीसी) को संशोधित करता है, जो वह रजिस्टर है जो नियंत्रित करता है कि सीपीयू अगले निर्देश को कहां पढ़ेगा।
  4. सीपीयू फिर अगले निर्देश को पढ़ने का प्रयास करता है। चूंकि हम कूद गए हैं, अगला निर्देश पहले संसाधित किए गए एक के तुरंत बाद नहीं है।

यह प्रक्रिया का एक सिंहावलोकन है। यदि आप गहराई से स्पष्टीकरण में अधिक चाहते हैं, तो मैं आपको एक कथन के साथ एक सरल सी प्रोग्राम लिखने, इसे संकलित करने, इसे अलग करने (लिनक्स objdump या समकक्ष का उपयोग करके) लिखने की सलाह देता हूं, और शायद इसे डीबगर संलग्न कर सकता हूं और इसे चला सकता हूं।

linux objdump manual

दिखाने के लिए अगले निर्देश gdb में निष्पादित किया जाना है, का उपयोग display/i $pc

1

तुम सिर्फ अगर हालत तो इसकी सरल लागू करने, बारे में चिंतित हैं, तो आप शायद डिजिटल पढ़ लिया है मॉरिस मनो द्वारा डिजाइन, वहां दो रजिस्टर की तुलना करने के लिए एक सरल सर्किट दिया जाता है, वैसे, तर्क सरल है यदि आप इसके बारे में सोचना चाहते हैं।

a>b OR a<b OR a==b all these 3 instructions can be implemented easily 
    by just comparing the two registers 

अब आप के बारे में कैसे करता है, तो कथन कि कैसे वास्तव में यह सीपीयू में कार्यान्वित किया जाता है तो यह के चरण 3 चक्र के माध्यम से चला जाता है लाओ, डिकोड और निष्पादित चिंतित हैं।

उसके बाद रजिस्टरों की तुलना पहले की तुलना में की जाती है।

उम्मीद है कि यह मदद करता है .. :)

+0

यह सिर्फ एक अस्पष्टता प्रश्न था, और थोड़ी देर पहले इसका उत्तर दिया गया था, हालांकि धन्यवाद। – Nealon

संबंधित मुद्दे