Nel codice assembly x86, sono JEe JNEesattamente gli stessi di JZe JNZ?
Nel codice assembly x86, sono JEe JNEesattamente gli stessi di JZe JNZ?
Risposte:
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.)
jb/ jc/ jnaetutti i test CF = 1. Vedi felixcloutier.com/x86/jcc (o cmovcc o setcc)
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).
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>