JE / JNE और JZ / JNZ के बीच अंतर


88

X86 असेंबली कोड में, JEऔर JNEबिल्कुल समान हैं JZऔर JNZ?


59
लंबे उत्तर: हाँ।
हंस पैसेंट

9
संक्षिप्त उत्तर: नहीं। (लेकिन वे वास्तव में एक ही मशीन कोड के अनुरूप हैं , इसलिए वे बिल्कुल एक ही काम करते हैं। उनके पास एक ही तुलना के लिए अलग-अलग mnemonics हैं।)

4
JE का मतलब होता है जंप करना अगर बराबर है, तो यह बराबर है अगर एक पूर्व तुलना में z फ्लैग सेट है, तो ZZ का मतलब है अगर z फ्लैग सेट है तो जंप करें। वे बिल्कुल समान हैं, कुछ लोग मेरी तुलना के संदर्भ में सोचना / लिखना चाहते थे समान था या नहीं के बराबर। कुछ लोग z झंडा सेट या z झंडा स्पष्ट है के संदर्भ में सोचते हैं और लिखते हैं।
old_timer

जवाबों:


124

JEऔर JZबिल्कुल एक ही चीज़ के लिए अलग-अलग नाम हैं: एक सशर्त कूद जब ZF("शून्य" ध्वज) 1 के बराबर है।

(इसी तरह, JNEऔर JNZएक सशर्त कूद के लिए सिर्फ अलग अलग नामों जब हैं ZF0. के बराबर है)

आप उनका उपयोग परस्पर विनिमय कर सकते हैं, लेकिन आपको उनका उपयोग इस आधार पर करना चाहिए कि आप क्या कर रहे हैं:

  • JZ/ JNZजब आप शून्य के बराबर कुछ के लिए स्पष्ट रूप से परीक्षण कर रहे हैं तो अधिक उपयुक्त हैं:

    dec  ecx
    jz   counter_is_now_zero
    
  • JEऔर JNEएक CMPनिर्देश के बाद अधिक उपयुक्त हैं :

    cmp  edx, 42
    je   the_answer_is_42
    

    (एक CMPनिर्देश एक घटाव प्रदर्शन करता है, और झंडे को रखते हुए, परिणाम के मूल्य को दूर फेंक देता है; यही कारण है कि ZF=1जब आप ऑपरेंड बराबर होते हैं और ZF=0जब वे नहीं होते हैं तो आप प्राप्त करते हैं।)


2
TL: DR: एक ही मशीन ऑपरेशन, विभिन्न अर्थ अर्थ। जैसे jb/ jc/ jnaeसभी परीक्षण सीएफ = 1। देखें felixcloutier.com/x86/jcc (या cmovcc या setcc)
पीटर Cordes

36

से इंस्ट्रक्शन सेट संदर्भ - इंटेल के मैनुअल , JEऔर JZएक ही opcode (राशि 74rel8 के लिए / 0F 84rel 16/32 के लिए) भी JNEऔर JNZ( 75rel8 के लिए / 0F 85rel के लिए 16/32) शेयर opcodes।

JEऔर JZवे दोनों ZF(या शून्य ध्वज) के लिए जांच करते हैं , हालांकि मैनुअल पहले JErel8 और JZrel8 ZFउपयोग के विवरण में थोड़ा भिन्न है , लेकिन मूल रूप से वे समान हैं।

यहाँ मैनुअल के पृष्ठों 464, 465 और 467 से एक उद्धरण है।

 Op Code    | mnemonic  | Description
 -----------|-----------|-----------------------------------------------  
 74 cb      | JE rel8   | Jump short if equal (ZF=1).
 74 cb      | JZ rel8   | Jump short if zero (ZF ← 1).

 0F 84 cw   | JE rel16  | Jump near if equal (ZF=1). Not supported in 64-bit mode.
 0F 84 cw   | JZ rel16  | Jump near if 0 (ZF=1). Not supported in 64-bit mode.

 0F 84 cd   | JE rel32  | Jump near if equal (ZF=1).
 0F 84 cd   | JZ rel32  | Jump near if 0 (ZF=1).

 75 cb      | JNE rel8  | Jump short if not equal (ZF=0).
 75 cb      | JNZ rel8  | Jump short if not zero (ZF=0).

 0F 85 cd   | JNE rel32 | Jump near if not equal (ZF=0).
 0F 85 cd   | JNZ rel32 | Jump near if not zero (ZF=0).

-5
  je : Jump if equal:

  399  3fb:   64 48 33 0c 25 28 00    xor    %fs:0x28,%rcx
  400  402:   00 00
  401  404:   74 05                   je     40b <sims_get_counter+0x51>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.