En el código ensamblador x86, son JE
y JNE
exactamente el mismo que JZ
y JNZ
?
En el código ensamblador x86, son JE
y JNE
exactamente el mismo que JZ
y JNZ
?
Respuestas:
JE
y JZ
son solo nombres diferentes para exactamente lo mismo: un salto condicional cuando ZF
(la bandera "cero") es igual a 1.
(De manera similar, JNE
y JNZ
son solo nombres diferentes para un salto condicional cuando ZF
es igual a 0).
Usted podría utilizar de forma indistinta, pero debe usarlos en función de lo que está haciendo:
JZ
/ JNZ
son más apropiados cuando está probando explícitamente que algo sea igual a cero:
dec ecx
jz counter_is_now_zero
JE
y JNE
son más apropiados después de una CMP
instrucción:
cmp edx, 42
je the_answer_is_42
(Una CMP
instrucción realiza una resta y arroja el valor del resultado, mientras mantiene las banderas; es por eso que obtiene ZF=1
cuando los operandos son iguales y ZF=0
cuando no lo son).
jb
/ jc
/ jnae
todas las pruebas CF = 1. Ver felixcloutier.com/x86/jcc (o cmovcc o setcc)
Del manual de Intel - Referencia de conjunto de instrucciones , JE
y JZ
tienen el mismo código de operación ( 74
para rel8 / 0F 84
para rel 16/32) JNE
y JNZ
( 75
para rel8 / 0F 85
para rel 16/32) comparten códigos de operación .
JE
y JZ
ambos verifican el ZF
(o el indicador cero), aunque el manual difiere ligeramente en las descripciones del primer uso de JE
rel8 y JZ
rel8 ZF
, pero básicamente son lo mismo.
Aquí hay un extracto de las páginas 464, 465 y 467 del manual.
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).