wake-up-neo.com

Unterschied zwischen JE / JNE und JZ / JNZ

Sind JE und JNE im x86-Assembly-Code genau gleich JZ und JNZ?

74
QuasarDonkey

JE und JZ sind nur unterschiedliche Namen für genau dasselbe: ein bedingter Sprung, wenn ZF (das "Null" -Flag) gleich 1 ist.

(Ebenso sind JNE und JNZ nur unterschiedliche Namen für einen bedingten Sprung, wenn ZF gleich 0 ist.)

Sie könnten verwenden sie austauschbar, aber Sie sollten verwenden sie je nachdem, was Sie tun:

  • JZ/JNZ sind geeigneter, wenn Sie explizit auf einen Wert von Null prüfen:

    dec  ecx
    jz   counter_is_now_zero
    
  • JE und JNE sind nach einer CMP Anweisung geeigneter:

    cmp  edx, 42
    je   the_answer_is_42
    

    (Eine CMP -Anweisung führt eine Subtraktion durch und wirft den Wert des Ergebnisses weg, während die Flags beibehalten werden. Aus diesem Grund erhalten Sie ZF=1 wenn die Operanden gleich sind und ZF=0 wenn sie nicht sind.)

104

Aus dem Intels Handbuch - Instruction Set Reference haben die JE und JZ den gleichen Opcode (74 für rel8/0F 84 für rel 16/32) auch JNE und JNZ (75 für rel8/0F 85 für rel 16/32) opcodes teilen.

JE und JZ prüfen beide auf das ZF (oder Null-Flag), obwohl das Handbuch in den Beschreibungen der ersten JE rel8 und JZ rel8 ZF Verwendung, aber im Grunde sind sie gleich.

Hier ist ein Auszug aus den Seiten 464, 465 und 467 des Handbuchs.

 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).
34
higuaro