assembly - je/jne和 jz/jnz之间的差异

在x86汇编代码中,JEJNEJZJNZ完全相同?

时间:

JE和JZ只是同一事物的不同名称:ZF("zero"标志)等于1时的条件跳转。

(类似地,当ZF等于0时,JNE和JNZ只是条件跳转的不同名称。)

  • 如果显式测试等于零的某些内容,则JZ /JNZ更合适:

    
    dec ecx
    jz counter_is_now_zero
    
    
  • CMP指令之后,JEJNE更适合:

    
    cmp edx, 42
    je the_answer_is_42
    
    

    (CMP指令执行减法,并在保留标志时抛出结果的值; 这就是为什么当操作数相等时获得ZF = 1而在操作数不相等时获得ZF = 0的原因。 )

从英特尔手册—指令集参考中,JE和JZ有相同的操作码(74 for rel8/0F 84 for rel 16/32 ),同样JNE和JNZ (75 for rel8/0F 85 for rel 16/32 )共享操作码。

JEJZ都检查ZF (或零标志),尽管手册在第一个JE rel8和JZ rel8 scp的使用中不同,但是基本上是相同的。

这是手册464 465和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).

...