关于 AT&T 语法汇编中的 cmp/jg、jle 等

hen*_*awn 3 x86 assembly att

所以每个在线资源都告诉我这样的事情:

cmp %eax, %ebx
jg < something >
Run Code Online (Sandbox Code Playgroud)

如果 eax 大于 ebx,将跳转到 < something >。但我有另一段似乎与此矛盾的代码:

cmp $0x2, %eax
jg  < something>
Run Code Online (Sandbox Code Playgroud)

当 eax 的值为 3 时,它会跳转到 < something >。

我是否遗漏了什么,或者如果 b > a 而不是 a>b,cmp a, b - jg 是否执行?这是否也适用于其他跳转语句?

Fif*_*nik 6

当我们阅读类似

cmp $0x2, %eax
jg  < something >
Run Code Online (Sandbox Code Playgroud)

我们知道所使用的汇编器是一种反转指令操作数位置的汇编器。那是因为 Intel 的语法规定目标操作数在源操作数之前,显然像 $0x2 这样的直接值永远不能作为目标!

了解事物的顺序后,我们现在将您的第一个代码片段解释为

cmp ebx, eax
jg < something >  ;jump if EBX > EAX
Run Code Online (Sandbox Code Playgroud)

和第二个代码片段为

cmp eax, 2
jg < something >  ;jump if EAX > 2
Run Code Online (Sandbox Code Playgroud)

这是否也适用于其他跳转语句?

确实如此。