JE / JNE和JZ / JNZ之间的区别


88

在x86汇编代码,都是JEJNE完全一样的JZJNZ


59
长答案:是的。
汉斯·帕桑

9
简短的回答:不。(但是它们对应于完全相同的机器代码,因此它们执行完全相同的操作。对于相同的比较,它们具有不同的助记符。)

4
JE表示相等时跳转,如果先验比较设置了z标志,则相等; JZ表示如果设置了z标志,则跳转。它们是完全相同的,有些人想根据我的比较是否相等来思考/写作。有些人以z标志集或z标志清除的方式来思考和书写。
old_timer 2013年

Answers:


124

JE并且JZ是完全相同的事物的不同名称:(ZF“零”标志)等于1时的条件跳转。

(类似地,当等于0时JNEJNZ它们只是条件跳转的不同名称。ZF

可以互换使用它们,但是您应该根据自己的使用情况使用它们:

  • JZ/JNZ在显式测试等于零的值时更合适:

    dec  ecx
    jz   counter_is_now_zero
    
  • JEJNECMP说明后更合适:

    cmp  edx, 42
    je   the_answer_is_42
    

    (一条CMP指令执行减法运算,然后将结果的值扔掉,同时保留这些标志;这就是为什么ZF=1当操作数相等时以及ZF=0在操作数不相等时得到的原因。)


2
TL:DR:相同的机器操作,不同的语义。就像jb/ jc/jnae所有的测试CF = 1。参见felixcloutier.com/x86/jcc(或cmovcc或setcc)
彼得·科德斯

36

Intel手册-指令集参考中JEJZ也具有相同的操作码(74对于rel8 /0F 84对于rel 16/32) JNE和和JNZ75对于rel8 /0F 85对于rel 16/32)共享操作码。

JE并且JZ它们都检查ZF(或零标志),尽管手册在第一个JErel8和JZrel8ZF用法的描述中略有不同,但是基本上它们是相同的。

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

-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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.