JE / JNE和JZ / JNZ的区别
在x86汇编代码中, JE
和JNE
与JZ
和JNZ
是否完全一样?
JE
和JZ
就是完全相同的名称: ZF
(“零”标志)等于1时的条件跳转。
(同样,当ZF
等于0时, JNE
和JNZ
只是条件跳转的不同名称)
你可以交换使用它们,但是你应该根据你在做什么来使用它们:
-
JZ
/JNZ
比较合适,当你明确地testing等于零的东西时:dec ecx jz counter_is_now_zero
-
JE
和JNE
在CMP
指令后更合适:cmp edx, 42 je the_answer_is_42
(一个
CMP
指令执行减法运算,并将结果的值抛出,同时保持标志;这就是为什么当操作数相等时ZF=1
,否则ZF=0
)。
从英特尔的手册 – 指令集参考中 , JE
和JZ
具有相同的操作码(对于rel16 / 32,74为rel8 / 0F84)也是JNE
和JNZ
(对于rel8 / 75
为75
,对于rel 16/32)共享操作码。
JE
和JZ
都检查ZF
(或零标志),虽然手册在第一个JE
rel8和JZ
rel8 ZF
使用的描述中略有不同,但基本上它们是相同的。
以下是手册页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).