【发布时间】:2012-02-18 15:59:13
【问题描述】:
我有下一条指令:
cmp al, 1
jz mub
当 al 为 2(二进制为 10)时。这条指令会做什么?据我所知,我可以使用JE,JNE,JA等,但是在cmp指令之后jz是什么意思?
谢谢
【问题讨论】:
-
jz = je,指令相同。
标签: assembly
我有下一条指令:
cmp al, 1
jz mub
当 al 为 2(二进制为 10)时。这条指令会做什么?据我所知,我可以使用JE,JNE,JA等,但是在cmp指令之后jz是什么意思?
谢谢
【问题讨论】:
标签: assembly
jz 是“如果为零则跳转”。 cmp 减去它的两个操作数,并相应地设置标志。 (参考here。)
如果两个操作数相等,则减法结果为零,ZF 标志将被设置。
因此,在您的示例中,如果 al 为 1,则将进行跳转,否则不会进行。
【讨论】:
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 相同。
【讨论】:
'Jump Zero' - 如果设置了零标志,则跳转到标签'mub'。 'cmp' 是只设置标志的减法,因此,如果 al 为 2,则 (2-1)0,因此零标志被清除并且不会执行跳转。
【讨论】: