汇编 - 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 指令的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向x86 汇编 ( cmp 比较指令 | test 比较指令 )