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

Posted

技术标签:

【中文标题】关于 AT&T 语法汇编中的 cmp/jg、jle 等【英文标题】:Regarding cmp / jg, jle, etc in AT&T syntax assembly 【发布时间】:2015-04-11 04:33:03 【问题描述】:

所以网上的每一个资源都告诉我这样的事情:

cmp %eax, %ebx
jg < something >
如果 eax 大于 ebx,

将跳转到 。但我有另一段代码似乎与此相矛盾:

cmp $0x2, %eax
jg  < something>

当 eax 的值为 3 时,它会跳转到

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

【问题讨论】:

看起来像 AT&T 语法,它将操作数的顺序错误。 【参考方案1】:

当我们读到类似

cmp $0x2, %eax
jg  < something >

我们知道使用的汇编程序是一种反转指令操作数位置的汇编程序。这是因为 Intel 的语法规定目标操作数在源操作数之前,并且像 $0x2 这样的立即值显然不能成为目标!

知道了我们现在将您的第一个代码 sn-p 解释为

cmp ebx, eax
jg < something >  ;jump if EBX > EAX

和第二个代码sn-p as

cmp eax, 2
jg < something >  ;jump if EAX > 2

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

确实如此。

【讨论】:

顺便说一下,寄存器名称前面的 % 符号也是一个赠品,我从未见过“英特尔约定”(目标、源)汇编程序使用这些。【参考方案2】:

看看 THIS ANSWER 是否对您有帮助。如果不是,请要求澄清。

向下滚动查看其他人的源代码和该答案中的内容以搜索此字符串...

这个 biz,cmpl %eax,%edx 指令,是“比较”指令的一种形式

我写了CMP的“意义”和各种条件跳转的解释。看看它是否在这里回答了你的问题。

如果您仍然感到困惑,请在此处发布注释,其他人可能会给您更好的答案。

希望对你有帮助。

【讨论】:

以上是关于关于 AT&T 语法汇编中的 cmp/jg、jle 等的主要内容,如果未能解决你的问题,请参考以下文章

需要一个很好的 AT&T 汇编语法来源

x86-64 汇编中的数组元素比较(AT&T 语法)

AT&T汇编语法与x86语法基本区别

Linux下的AT&amp;T语法(即GNU as 汇编语法)入门

在 TextMate 中突出显示 Intel 和 AT&T 汇编语法

Linux下AT&T汇编语法格式与Intel汇编语法格式异同