JE/JNE和JZ/JNZ的区别
Posted
技术标签:
【中文标题】JE/JNE和JZ/JNZ的区别【英文标题】:Difference between JE/JNE and JZ/JNZ 【发布时间】:2012-12-25 09:08:41 【问题描述】:在 x86 汇编代码中,JE
和 JNE
是否与 JZ
和 JNZ
完全相同?
【问题讨论】:
长答案:是的。 简短回答:不。 (但它们对应完全相同的机器代码,所以它们完全做同样的事情。它们只是在相同的比较中使用不同的助记符。) JE 表示如果相等则跳转,如果之前的比较设置了 z 标志则相等,JZ 表示如果设置了 z 标志则跳转。它们完全相同,有些人想根据我的比较来思考/写是相等还是不相等。有些人思考和写作的术语是设置 z 标志还是清除 z 标志。 【参考方案1】:JE
和 JZ
只是同一事物的不同名称:a
ZF
(“零”标志)等于 1 时的条件跳转。
(同样,JNE
和 JNZ
只是条件跳转的不同名称
当ZF
等于0。)
您可以交替使用它们,但您应该根据具体情况使用它们 你在做什么:
JZ
/JNZ
在显式测试时更合适
对于等于零的东西:
dec ecx
jz counter_is_now_zero
JE
和 JNE
在 CMP
指令之后更合适:
cmp edx, 42
je the_answer_is_42
(CMP
指令执行减法,并将结果的值扔掉,同时保留标志;这就是为什么当操作数相等时会得到 ZF=1
和ZF=0
,如果不是。)
【讨论】:
TL:DR:相同的机器操作,不同的语义含义。就像jb
/ jc
/ jnae
所有测试 CF=1。请参阅felixcloutier.com/x86/jcc(或 cmovcc 或 setcc)【参考方案2】:
从Intel's manual - Instruction Set Reference 开始,JE
和 JZ
具有相同的操作码(74
用于 rel8 / 0F 84
用于 rel 16/32)还有 JNE
和 JNZ
(75
用于rel8 / 0F 85
用于 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).
【讨论】:
【参考方案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的区别的主要内容,如果未能解决你的问题,请参考以下文章
2018-2019-1 20165329 《信息安全系统设计基础》第4周学习总结