2009-10-17 13 views
12

मैं ऑनलाइन असेंबली भाषा समारोह "जे" के उपयोग को खोजने की कोशिश कर रहा हूं। मैंने पढ़ा कि जी का मतलब है कि बराबर कूदें और यही वही है जो मैं चाहता हूं। इस फ़ंक्शन का वास्तविक उपयोग क्या है, या दूसरे शब्दों में, मैं इस फ़ंक्शन को एक मूल्य की जांच करने के लिए कैसे टाइप करूं और कूदूं यदि यह किसी चीज़ के बराबर है?असेंबली भाषा जे कूद कूद

कृपया मुझे बताएं।

बीटीडब्ल्यू, अगर मैं कोई फर्क पड़ता हूं तो मैं NASM का उपयोग कर रहा हूं।

उत्तर

16

मान लीजिए कि आप जाँच करना चाहते हैं, तो EAX5 के बराबर है, और है कि तुलना के परिणाम के आधार पर अलग अलग क्रियाएं करते हैं । एक if-statement, दूसरे शब्दों में।

; ... some code ... 

    cmp eax, 5 
    je .if_true 
    ; Code to run if comparison is false goes here. 
    jmp short .end_if 
.if_true: 
    ; Code to run if comparison is true goes here. 
.end_if: 

    ; ... some code ... 
+0

कौन सा असेंबलर सिंटैक्स यहां उपयोग किया जा रहा है? –

+0

अगर मुझे सही याद है तो यह वैध NASM होना चाहिए। – bcat

+0

क्या यह ईएक्स से किसी अन्य रजिस्टर की जांच कर सकता है? –

1

ठीक है, मुझे अंत में मेरा जवाब मिला। : पी मूल रूप से आप एक cmp कॉल के बाद je label_to_jump_to को कॉल करते हैं।

यदि सीएमपी दिखाता है कि दो मान बराबर हैं, तो जे निर्दिष्ट लेबल पर कूद जाएगा। यदि नहीं, तो यह निष्पादन बहता रहेगा।

+4

एडस्गर डिजस्ट्रा ने असेंबलर से नफरत की होगी; यह GOTO से भरा है :-) –

+4

इसे 'सीएमपी' निर्देश का पालन नहीं करना है, हालांकि यह सबसे आम मामला है। जैसा कि अन्य ने कहा है, 'जेसीसी' निर्देश किसी भी निर्देश का पालन कर सकते हैं जो 'फ्लैग' सेट करता है। इसमें लगभग सभी अंकगणितीय निर्देश और कुछ अन्य शामिल हैं। – bcat

2

आप एक cmp (या test या समतुल्य) आमतौर पर है, जो EFLAGS रजिस्टर में एक ध्वज सेट के साथ je पूर्व में होना होगा। NASM में एक साधारण इको सर्वर पर link यहां है जो सामान्य रूप से मदद कर सकता है। परेशान Google विज्ञापनों को अनदेखा करें।

je के लिए एक उदाहरण उपयोग हो सकता है:

cmp eax, ebx 
    je RET_FAIL 
    jmp RET_SUCCESS 

RET_FAIL: 
    push 1 
    pop eax 
    ret 

RET_SUCCESS: 
    push 0 
    pop eax 
    ret 
+0

यदि RET_SUCCESS RET_FAIL से पहले प्रकट होता है तो आपको दूसरी छलांग की आवश्यकता नहीं होती है। – asveikau

+0

धन्यवाद, यह सिर्फ एक अपरिवर्तित छात्र के असाइनमेंट से कॉपी-पास्ता था। – mrduclaw

10

यह अगर FLAGS रजिस्टर में "बराबर झंडा" (भी "शून्य झंडा" के रूप में जाना जाता है) के लिए निर्धारित है पर चला जाएगा। यह अंकगणितीय परिचालन, या TEST और CMP जैसे निर्देशों के परिणामस्वरूप सेट हो जाता है।

उदाहरण के लिए: (यदि स्मृति मुझे कार्य करता है सही यह है सही :-)

cmp eax, ebx ; Subtract EBX from EAX -- the result is discarded 
       ; but the FLAGS register is set according to the result. 
je .SomeLabel ; Jump to some label if the result is zero (ie. they are equal). 
       ; This is also the same instruction as "jz".
4

मैं कहना है जेई समारोह यदि शून्य ध्वज सेट है परीक्षण करने के लिए और फिर कहीं और करने के लिए कूद या अगले निर्देश है कि इस प्रकार के लिए जारी है।

test cx, cx 
je some_label 

परीक्षण निर्देश बस थोड़ा सा और दो ऑपरेटरों का करता है, और परिणाम के अनुसार FLAG सेट करता है। जी निर्देश तब कूदने या जारी रखने का निर्णय लेने के लिए शून्य ध्वज का उपयोग करता है।

उपरोक्त कोड का उपयोग यह जांचने के लिए किया जाता है कि सीएक्स शून्य है या नहीं।

  • यदि सीएक्स शून्य है, तो परीक्षण शून्य ध्वज सेट करेगा, फिर जे किसी स्थान पर कूदने का कारण बन जाएगा;
  • यदि सीएक्स शून्य नहीं है, तो परीक्षण शून्य ध्वज सेट नहीं करेगा, जे निम्न निर्देशों को निष्पादित करना जारी रखेगा।

नोट: जे बराबर परीक्षण नहीं करना है, लेकिन इसके पहले कुछ निर्देशों द्वारा निर्धारित शून्य ध्वज का परीक्षण करने के लिए है।

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