Diferencia entre JE / JNE y JZ / JNZ


89

En el código ensamblador x86, son JEy JNEexactamente el mismo que JZy JNZ?


59
Respuesta larga: sí.
Hans Passant

9
Respuesta corta: no. (Pero corresponden exactamente al mismo código de máquina, por lo que hacen exactamente lo mismo. Solo tienen diferentes mnemónicos para la misma comparación).

4
JE significa salto si es igual, es igual si una comparación previa tiene la bandera z activada, JZ significa salto si la bandera z está activada. Son exactamente iguales, algunas personas quieren pensar / escribir en términos de mi comparación fue igual o no igual. Algunas personas piensan y escriben en términos de si la bandera z está establecida o la bandera z está clara.
old_timer

Respuestas:


125

JEy JZson solo nombres diferentes para exactamente lo mismo: un salto condicional cuando ZF(la bandera "cero") es igual a 1.

(De manera similar, JNEy JNZson solo nombres diferentes para un salto condicional cuando ZFes igual a 0).

Usted podría utilizar de forma indistinta, pero debe usarlos en función de lo que está haciendo:

  • JZ/ JNZson más apropiados cuando está probando explícitamente que algo sea igual a cero:

    dec  ecx
    jz   counter_is_now_zero
    
  • JEy JNEson más apropiados después de una CMPinstrucción:

    cmp  edx, 42
    je   the_answer_is_42
    

    (Una CMPinstrucción realiza una resta y arroja el valor del resultado, mientras mantiene las banderas; es por eso que obtiene ZF=1cuando los operandos son iguales y ZF=0cuando no lo son).


2
TL: DR: misma operación de máquina, diferente significado semántico . Al igual que jb/ jc/ jnaetodas las pruebas CF = 1. Ver felixcloutier.com/x86/jcc (o cmovcc o setcc)
Peter Cordes

36

Del manual de Intel - Referencia de conjunto de instrucciones , JEy JZtienen el mismo código de operación ( 74para rel8 / 0F 84para rel 16/32) JNEy JNZ( 75para rel8 / 0F 85para rel 16/32) comparten códigos de operación .

JEy JZambos verifican el ZF(o el indicador cero), aunque el manual difiere ligeramente en las descripciones del primer uso de JErel8 y JZrel8 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).

-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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.