汇编 - CMP 后的 JZ 指令

Posted

技术标签:

【中文标题】汇编 - CMP 后的 JZ 指令【英文标题】:Assembly - JZ instruction after CMP 【发布时间】:2012-02-18 15:59:13 【问题描述】:

我有下一条指令:

cmp al, 1
jz mub

当 al 为 2(二进制为 10)时。这条指令会做什么?据我所知,我可以使用JE,JNE,JA等,但是在cmp指令之后jz是什么意思?

谢谢

【问题讨论】:

jz = je,指令相同。 【参考方案1】:

jz 是“如果为零则跳转”。 cmp 减去它的两个操作数,并相应地设置标志。 (参考here。)

如果两个操作数相等,则减法结果为零,ZF 标志将被设置。

因此,在您的示例中,如果 al 为 1,则将进行跳转,否则不会进行。

【讨论】:

【参考方案2】:

jz 表示如果为零则跳转。在这种情况下,它只会在 al 为 1 时跳转。

这是因为cmp 通常等同于sub(减法),但实际上并没有改变值。

cmp al, 1 将根据您从al 中减去 1 所发生的情况来设置处理器标志(包括零标志)。

如果al 为2,则不会进行跳转(因为尚未设置零标志),代码将继续执行jz 之后的指令。

顺便说一句,jz 通常与je 的操作码相同,因为它们实际上意味着相同的东西。参见例如Wikipedia page on x86 control flow:

从零开始jz loc 如果从先前的算术表达式中设置了零位,则加载具有指定地址的 EIP。 jz 与 je 相同。

【讨论】:

【参考方案3】:

'Jump Zero' - 如果设置了零标志,则跳转到标签'mub'。 'cmp' 是只设置标志的减法,因此,如果 al 为 2,则 (2-1)0,因此零标志被清除并且不会执行跳转。

【讨论】:

以上是关于汇编 - CMP 后的 JZ 指令的主要内容,如果未能解决你的问题,请参考以下文章

16位汇编第六讲汇编指令详解第二讲

汇编指令之CMP, TEST指令

Android 逆向x86 汇编 ( cmp 比较指令 | test 比较指令 )

Android 逆向x86 汇编 ( cmp 比较指令 | test 比较指令 )

汇编语言 CMP指令

《汇编语言(第三版)》cmp指令