[英]JNZ & CMP Assembly Instructions
如果我错了,请纠正我。
这是我对JNZ
和CMP
理解。
JNZ
- 如果Z
标志不为零,则跳转将发生 (1)
CMP
- 如果两个值相等,则设置Z
标志 (1) 否则不设置 (0)
这是我正在观看的 Flash 教程。 它正在教一个简单的 CrackMe 的解决方案。
如您所见,上47h
指令将AL
与47h
进行了比较。 它们相等,设置了Z
标志。 (您可以在右侧的寄存器窗口中看到它)
下一条指令是JNZ
。 我的理解是,如果设置了Z
标志,就会发生跳转。 Z
标志已设置,但没有发生跳转!
为什么?
JNZ 是“如果不为零则跳转(ZF = 0)”的缩写,而不是“如果设置了 ZF 则跳转”。
如果更容易记住,请考虑 JNZ 和 JNE(如果不相等则跳转)是等价的。 因此,当您执行cmp al, 47
并且AL
的内容等于 47 时,ZF 已设置,因此不应进行跳转(如果不等于 - JNE)。
我会在这里做一个更广泛的答案。
在 x86 中一般有两种类型的条件跳转:
算术跳转 - 如 JZ(如果为零则跳转)、JC(如果进位则跳转)、JNC(如果没有进位则跳转)等。
比较跳转 - JE(如果相等则跳转)、JB(如果低于则跳转)、JAE(如果高于或相等则跳转)等。
因此,仅在算术或逻辑指令之后使用第一种类型:
sub eax, ebx
jnz .result_is_not_zero
and ecx, edx
jz .the_bit_is_not_set
仅在 CMP 指令后使用第二组:
cmp eax, ebx
jne .eax_is_not_equal_to_ebx
cmp ecx, edx
ja .ecx_is_above_than_edx
这样,程序变得更具可读性,您永远不会感到困惑。
请注意,有时这些说明实际上是同义词。 JZ == JE; JC == JB; JNC == JAE 等等。 完整表格如下。 如您所见,只有 16 条条件跳转指令,但有 30 条助记符——提供它们以允许创建更具可读性的源代码:
Mnemonic Condition tested Description
jo OF = 1 overflow
jno OF = 0 not overflow
jc, jb, jnae CF = 1 carry / below / not above nor equal
jnc, jae, jnb CF = 0 not carry / above or equal / not below
je, jz ZF = 1 equal / zero
jne, jnz ZF = 0 not equal / not zero
jbe, jna CF or ZF = 1 below or equal / not above
ja, jnbe CF and ZF = 0 above / not below or equal
js SF = 1 sign
jns SF = 0 not sign
jp, jpe PF = 1 parity / parity even
jnp, jpo PF = 0 not parity / parity odd
jl, jnge SF xor OF = 1 less / not greater nor equal
jge, jnl SF xor OF = 0 greater or equal / not less
jle, jng (SF xor OF) or ZF = 1 less or equal / not greater
jg, jnle (SF xor OF) or ZF = 0 greater / not less nor equal
起初,JNZ 似乎意味着如果不是零 (0) 则跳转,就像在零标志为 1/set 时跳转一样。
但实际上它意味着跳转(如果)不为零(设置)。
如果 0 = 未设置且 1 = 设置,请记住:
如果未设置零标志 (0),则 JNZ 跳转
JNZ Jump if Not Zero ZF=0
确实,这是令人困惑的权利。
为了更容易理解,将Not Zero替换为Not Set 。 (请注意,这是您自己的理解)
因此,
JNZ Jump if Not Set ZF=0
未设置意味着标志 Z = 0。所以跳转(如果未设置则跳转)
设置意味着标志 Z = 1。所以,不要跳转
您可以将 JNE/Z 读作 *
ĴUMP如果状态是E上QUAL / Z ERO标志“N OT集”
“未设置”是当 CPU 中的“相等/零标志”设置为 0 时的状态,这仅在条件满足或相等匹配时发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.