बयान तो बराबर है, और अन्य सभी नियंत्रण प्रवाह बयान, कर रहे हैं सशर्त कूद के रूप में तर्क स्तर पर लागू किया गया।
जब आप इस तरह बयान करता है, तो एक का उपयोग करें,:
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। प्रोसेसर लोडिंग और लांचिंग निर्देशों की प्रक्रिया का समर्थन करने के लिए अतिरिक्त सामान का एक गुच्छा करता है, जो यहां प्रासंगिक है। प्रोग्राम काउंटर (बाद में पीसी रजिस्टर के रूप में संदर्भित) नामक एक विशेष रजिस्टर है, जो प्रोसेसर निष्पादित करने वाले अगले ऑपोड के स्थान को ट्रैक करता है।
- सबसे पहले, सीएमपी निर्देश पहले से दूसरे ऑपरेंड को घटा देता है, और परिणाम को त्याग देता है। हालांकि, FLAGS रजिस्टर अंकगणितीय संचालन के परिणामों के साथ अद्यतन किया जाता है।
- फिर, जेजी निर्देश जांचता है कि FLAGS रजिस्टर में ग्रेटर ध्वज सेट है या नहीं। चूंकि यह हमारे उदाहरण में है (याद रखें कि 1> 0), यह एक कूद करता है।
- कूद निर्देश प्रोग्राम काउंटर (पीसी) को संशोधित करता है, जो वह रजिस्टर है जो नियंत्रित करता है कि सीपीयू अगले निर्देश को कहां पढ़ेगा।
- सीपीयू फिर अगले निर्देश को पढ़ने का प्रयास करता है। चूंकि हम कूद गए हैं, अगला निर्देश पहले संसाधित किए गए एक के तुरंत बाद नहीं है।
यह प्रक्रिया का एक सिंहावलोकन है। यदि आप गहराई से स्पष्टीकरण में अधिक चाहते हैं, तो मैं आपको एक कथन के साथ एक सरल सी प्रोग्राम लिखने, इसे संकलित करने, इसे अलग करने (लिनक्स objdump
या समकक्ष का उपयोग करके) लिखने की सलाह देता हूं, और शायद इसे डीबगर संलग्न कर सकता हूं और इसे चला सकता हूं।
linux objdump
manual
दिखाने के लिए अगले निर्देश gdb
में निष्पादित किया जाना है, का उपयोग display/i $pc
महान प्रश्न! हालांकि जटिल जवाब। आपको इसे पूरी तरह से समझने के लिए यह देखने की आवश्यकता है, मैं एक सरल उदाहरण लिखने, इसे संकलित करने, इसे डीबगर से जोड़ने, और इसके माध्यम से कदम उठाने की सलाह देता हूं, एक समय में एक निर्देश। – Wug
@wug यह एक अच्छा विचार है, धन्यवाद। – Nealon