Nel codice assembly x86, sono JE
e JNE
esattamente gli stessi di JZ
e JNZ
?
Nel codice assembly x86, sono JE
e JNE
esattamente gli stessi di JZ
e JNZ
?
Risposte:
JE
e JZ
sono solo nomi diversi per esattamente la stessa cosa: un salto condizionale quando ZF
(il flag "zero") è uguale a 1.
(Allo stesso modo, JNE
e JNZ
sono 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
/ JNZ
sono più appropriati quando stai testando esplicitamente che qualcosa sia uguale a zero:
dec ecx
jz counter_is_now_zero
JE
e JNE
sono più appropriati dopo CMP
un'istruzione:
cmp edx, 42
je the_answer_is_42
( CMP
Un'istruzione esegue una sottrazione e getta via il valore del risultato, mantenendo i flag; motivo per cui ottieni ZF=1
quando gli operandi sono uguali e ZF=0
quando non lo sono.)
jb
/ jc
/ jnae
tutti i test CF = 1. Vedi felixcloutier.com/x86/jcc (o cmovcc o setcc)
Dal manuale Intel - Instruction Set Reference , JE
e JZ
hanno lo stesso codice 74
operativo ( per rel8 / 0F 84
per rel 16/32) JNE
e JNZ
( 75
per rel8 / 0F 85
per rel 16/32) condividono anche gli opcode.
JE
ed JZ
entrambi controllano il ZF
flag (o zero), sebbene il manuale differisca leggermente nelle descrizioni del primo utilizzo di JE
rel8 e JZ
rel8 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).
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>