2013-01-10 4 views
54

Nel codice assembly x86, sono JE e JNE esattamente identici a JZ e JNZ?Differenza tra JE/JNE e JZ/JNZ

+38

risposta lunga: sì. –

+6

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

+3

JE significa saltare se uguale, è uguale se un confronto precedente ha il z flag set, JZ significa saltare se è impostato il flag z. Sono esattamente gli stessi, alcune persone vogliono pensare/scrivere in termini di paragone uguale o non uguale. Alcuni pensano e scrivono in termini di z flag o z flag clear. –

risposta

75

JE e JZ sono solo nomi diversi per esattamente la stessa cosa: un salto condizionato quando ZF (il flag "zero") è uguale a 1.

(Allo stesso modo, JNE e JNZ sono solo nomi diversi per un salto condizionato quando ZF è uguale a 0.)

si potrebbe usarli in modo intercambiabile, ma si dovrebbe usarle a seconda quello che state facendo:

  • JZ/JNZ sono più appropriato quando si esegue il test in modo esplicito per qualcosa che è uguale a zero:

    dec ecx 
    jz counter_is_now_zero 
    
  • JE e JNE sono più appropriata dopo un'istruzione CMP :

    cmp edx, 42 
    je the_answer_is_42 
    

    (A CMP l'istruzione esegue una sottrazione e getta via il valore del risultato mantenendo le bandiere; che è il motivo per cui si ottiene ZF=1 quando gli operandi sono uguali e ZF=0 quando non lo sono.)

30

Dal Intel's manual - Instruction Set Reference, il JE e JZ hanno lo stesso codice operativo (74 per REL8/0F 84 per rel 16/32) anche JNE e JNZ (75 per rel8/0F 85 per rel 16/32) condivisione di opcode.

JE e JZ entrambi controllo per la (o bandiera zero) ZF, anche se il manuale differisce leggermente nelle descrizioni della prima JE REL8 e JZ REL8 ZF utilizzo, ma fondamentalmente sono uguali.

Ecco un estratto dalle pagine del manuale 464, 465 e 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).