我试图了解汇编语言如何用于微型计算机体系结构类,并且在示例中我一直面临不同的语法:
sub $48, %esp
mov %eax, 32(%esp)
这些代码是什么意思?esp寄存器的32个操作数是什么?
$
前缀用于立即数(常量),前缀%
用于寄存器(它们是必需的1)。
有关 AT&T 语法的更多信息,另请参阅标记[att]
wiki。
1除非noprefix
指定选项,请参见此处和此处。但通常noprefix
只与.intel_syntax noprefix
, 一起使用以获得类似 MASM 的语法。
与 Intel 语法相比,AT&T 语法有很多不同之处
$
表示一个常数(整数字面量)。没有它,数字是一个绝对地址%
表示一个寄存器()
用于内存引用,就像[]
在 Intel 语法中一样所以上面的代码片段相当于
sub esp, 48 ; esp -= 48
mov [esp+32], eax ; store eax to the value at the address `esp + 32`
是的,“32(%esp)”表示从 %esp 偏移 32。
正如@Necrolis 所说,这是用 AT&T 语法编写的。它的意思是:
subtract 48 from the register esp (the stack pointer).
store the contents of eax to the four bytes starting at (esp + 32).
这是 x86 的 AT&T 语法。在 AT&T中,%
通常表示寄存器,而$
保留用于立即数。如果您省略 th $
,汇编器会将 48 解释为地址。