【发布时间】:2014-04-06 08:55:39
【问题描述】:
我想知道是否可以像 cmp 一样使用测试指令。比方说:
cmp %eax,%ebx
jg some_random_place
如果 %ebx 大于 %eax,则跳转到 some_random_place,现在如果我这样做:
test %eax, %ebx
jg some_random_place
在什么条件下会跳转?
【问题讨论】:
我想知道是否可以像 cmp 一样使用测试指令。比方说:
cmp %eax,%ebx
jg some_random_place
如果 %ebx 大于 %eax,则跳转到 some_random_place,现在如果我这样做:
test %eax, %ebx
jg some_random_place
在什么条件下会跳转?
【问题讨论】:
不!
cmp %eax,%ebx 指令类似于sub %eax,%ebx 指令,但cmp 指令执行后的寄存器保持不变,除了标志寄存器。
test %eax,%ebx 指令类似于and %eax,%ebx 指令,但test 指令执行后的寄存器保持不变,除了标志寄存器。
受影响的标志是进位 = 0、零 = x、溢出 = 0 和符号 = x
jg 指令应在零标志 = 0 且符号标志 = 溢出时执行跳转
所以万一……
test %eax, %ebx
jg some_random_place
...如果and %eax,%ebx的结果为正而不是0,则应该执行跳转。
【讨论】:
and 或 test 指令永远不会上升溢出标志,但正如我所写的,只有在指令执行后才会清除。