JE/JNE和JZ/JNZ的区别

Posted

技术标签:

【中文标题】JE/JNE和JZ/JNZ的区别【英文标题】:Difference between JE/JNE and JZ/JNZ 【发布时间】:2012-12-25 09:08:41 【问题描述】:

在 x86 汇编代码中,JEJNE 是否与 JZJNZ 完全相同?

【问题讨论】:

长答案:是的。 简短回答:不。 (但它们对应完全相同的机器代码,所以它们完全做同样的事情。它们只是在相同的比较中使用不同的助记符。) JE 表示如果相等则跳转,如果之前的比较设置了 z 标志则相等,JZ 表示如果设置了 z 标志则跳转。它们完全相同,有些人想根据我的比较来思考/写是相等还是不相等。有些人思考和写作的术语是设置 z 标志还是清除 z 标志。 【参考方案1】:

JEJZ 只是同一事物的不同名称:a ZF(“零”标志)等于 1 时的条件跳转。

(同样,JNEJNZ 只是条件跳转的不同名称 当ZF 等于0。)

可以交替使用它们,但您应该根据具体情况使用它们 你在做什么:

JZ/JNZ 在显式测试时更合适 对于等于零的东西:

dec  ecx
jz   counter_is_now_zero

JEJNECMP 指令之后更合适:

cmp  edx, 42
je   the_answer_is_42

(CMP 指令执行减法,并将结果的值扔掉,同时保留标志;这就是为什么当操作数相等时会得到 ZF=1ZF=0,如果不是。)

【讨论】:

TL:DR:相同的机器操作,不同的语义含义。就像 jb / jc / jnae 所有测试 CF=1。请参阅felixcloutier.com/x86/jcc(或 cmovcc 或 setcc)【参考方案2】:

从Intel's manual - Instruction Set Reference 开始,JEJZ 具有相同的操作码(74 用于 rel8 / 0F 84 用于 rel 16/32)还有 JNEJNZ75 用于rel8 / 0F 85 用于 rel 16/32)共享操作码。

JEJZ 它们都检查 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).

【讨论】:

【参考方案3】:
  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>

【讨论】:

以上是关于JE/JNE和JZ/JNZ的区别的主要内容,如果未能解决你的问题,请参考以下文章

汇编 - CMP 后的 JZ 指令

第四周学习总结

x86 汇编器:浮点比较

2018-2019-1 20165329 《信息安全系统设计基础》第4周学习总结

2018-2019-1 20165304 《信息安全系统设计基础》第四周学习总结

分析恶意驱动