Differenza tra JE / JNE e JZ / JNZ


92

Nel codice assembly x86, sono JEe JNEesattamente gli stessi di JZe JNZ?


60
Risposta lunga: sì.
Hans Passant

9
Risposta breve: no. (Ma corrispondono esattamente allo stesso codice macchina, quindi fanno esattamente la stessa cosa. Hanno solo mnemonici diversi per lo stesso confronto.)

4
JE significa salta se uguale, è uguale se un confronto precedente ha il flag z impostato, JZ significa salta se è impostato il flag z. Sono esattamente gli stessi, alcune persone vogliono pensare / scrivere in base al mio confronto era uguale o non uguale. Alcune persone pensano e scrivono in termini di flag z impostato o flag z chiaro.
old_timer

Risposte:


127

JEe JZsono solo nomi diversi per esattamente la stessa cosa: un salto condizionale quando ZF(il flag "zero") è uguale a 1.

(Allo stesso modo, JNEe JNZsono solo nomi diversi per un salto condizionale quando ZFè uguale a 0.)

Si potrebbe usarli in modo intercambiabile, ma si consiglia di usarli a seconda di cosa si sta facendo:

  • JZ/ JNZsono più appropriati quando stai testando esplicitamente che qualcosa sia uguale a zero:

    dec  ecx
    jz   counter_is_now_zero
    
  • JEe JNEsono più appropriati dopo CMPun'istruzione:

    cmp  edx, 42
    je   the_answer_is_42
    

    ( CMPUn'istruzione esegue una sottrazione e getta via il valore del risultato, mantenendo i flag; motivo per cui ottieni ZF=1quando gli operandi sono uguali e ZF=0quando non lo sono.)


2
TL: DR: stessa operazione di macchina, significato semantico diverso . Proprio come jb/ jc/ jnaetutti i test CF = 1. Vedi felixcloutier.com/x86/jcc (o cmovcc o setcc)
Peter Cordes

36

Dal manuale Intel - Instruction Set Reference , JEe JZhanno lo stesso codice 74operativo ( per rel8 / 0F 84per rel 16/32) JNEe JNZ( 75per rel8 / 0F 85per rel 16/32) condividono anche gli opcode.

JEed JZentrambi controllano il ZFflag (o zero), sebbene il manuale differisca leggermente nelle descrizioni del primo utilizzo di JErel8 e JZrel8 ZF, ma fondamentalmente sono gli stessi.

Ecco un estratto dalle pagine 464, 465 e 467 del manuale.

 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.