test 和 cmp 一样吗?

Set*_*r22 1 x86 att

我想知道测试指令是否可以与cmp一样使用。让我们说:

cmp %eax,%ebx
jg some_random_place
Run Code Online (Sandbox Code Playgroud)

如果 %ebx 大于 %eax,则跳转到 some_random_place,现在如果我这样做:

test %eax, %ebx
jg some_random_place
Run Code Online (Sandbox Code Playgroud)

在什么条件下会跳转?

GJ.*_*GJ. 5

不!

所述cmp %eax,%ebxinstuction是像sub %eax,%ebx指令,但与cmp指令执行之后寄存器保持不变,除了标志寄存器。

所述test %eax,%ebxinstuction是像and %eax,%ebx指令,但与test指令执行之后寄存器保持不变,除了标志寄存器。受影响的标志是进位 = 0、零 = x、溢出 = 0 和符号 = x

jg如果零标志 = 0 和符号标志 = 溢出,指令应该执行跳转

所以万一...

test %eax, %ebx
jg some_random_place
Run Code Online (Sandbox Code Playgroud)

...如果结果and %eax,%ebx为正数而不是 0,则应执行跳转。