Unterschied zwischen JE / JNE und JZ / JNZ


87

In x86 - Assembler - Code sind JEund JNEgenau das gleiche wie JZund JNZ?


58
Lange Antwort: ja.
Hans Passant

9
Kurze Antwort: nein. (Aber sie entsprechen genau dem gleichen Maschinencode, also machen sie genau das Gleiche. Sie haben nur unterschiedliche Mnemoniken für den gleichen Vergleich.)

4
JE bedeutet Sprung, wenn gleich, es ist gleich, wenn bei einem vorherigen Vergleich das Z-Flag gesetzt ist, JZ bedeutet Sprung, wenn das Z-Flag gesetzt ist. Sie sind genau die gleichen, einige Leute wollen denken / schreiben in Bezug auf meinen Vergleich war gleich oder nicht gleich. Einige Leute denken und schreiben in Bezug auf das Setzen der Z-Flagge oder das Löschen der Z-Flagge.
old_timer

Antworten:


122

JEund JZsind nur verschiedene Namen für genau dasselbe: ein bedingter Sprung, wenn ZF(das "Null" -Flag) gleich 1 ist.

(Ähnlich JNEund JNZsind nur verschiedene Namen für einen bedingten Sprung, wenn er ZFgleich 0 ist.)

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

  • JZ/ JNZSind besser geeignet , wenn Sie ausdrücklich etwas paribus auf Null zu testen sind:

    dec  ecx
    jz   counter_is_now_zero
    
  • JEund JNEsind nach einer CMPAnweisung besser geeignet :

    cmp  edx, 42
    je   the_answer_is_42
    

    (Ein CMPBefehl führt eine Subtraktion durch und wirft den Wert des Ergebnisses weg, während die Flags ZF=1beibehalten werden. Deshalb erhalten Sie, wenn die Operanden gleich sind und ZF=0wenn sie nicht.)


2
TL: DR: gleicher Maschinenbetrieb, unterschiedliche semantische Bedeutung. Genau wie jb/ jc/ jnaealle Tests CF = 1. Siehe felixcloutier.com/x86/jcc (oder cmovcc oder setcc)
Peter Cordes

36

Aus dem Intel-Handbuch - Instruction Set Reference , haben die JEund JZden gleichen Opcode ( 74für rel8 / 0F 84für rel 16/32) JNEund JNZ( 75für rel8 / 0F 85für rel 16/32) Opcodes gemeinsam.

JEund JZbeide suchen nach dem ZF(oder Null-Flag), obwohl sich das Handbuch in den Beschreibungen der ersten Verwendung von JErel8 und JZrel8 geringfügig unterscheidet ZF, 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).

-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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.