43

我试图了解汇编语言如何用于微型计算机体系结构类,并且在示例中我一直面临不同的语法:

sub $48, %esp
mov %eax, 32(%esp)

这些代码是什么意思?esp寄存器的32个操作数是什么?

4

5 回答 5

39

那不是英特尔语法,它的AT&T 语法,也称为GAS 语法

$前缀用于立即数(常量),前缀%用于寄存器(它们是必需的1)。

有关 AT&T 语法的更多信息,另请参阅标记[att]wiki


1除非noprefix指定选项,请参见此处此处。但通常noprefix只与.intel_syntax noprefix, 一起使用以获得类似 MASM 的语法。

于 2012-02-08T15:53:43.457 回答
11

与 Intel 语法相比,AT&T 语法有很多不同之处

  • $表示一个常数(整数字面量)。没有它,数字是一个绝对地址
  • %表示一个寄存器
  • 源/目标顺序颠倒
  • ()用于内存引用,就像[]在 Intel 语法中一样

所以上面的代码片段相当于

sub esp, 48         ; esp -= 48
mov [esp+32], eax   ; store eax to the value at the address `esp + 32`
于 2014-06-19T01:18:00.380 回答
2

是的,“32(%esp)”表示从 %esp 偏移 32。

于 2012-02-09T06:49:34.023 回答
1

正如@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).
于 2012-02-08T15:56:34.760 回答
0

这是 x86 的 AT&T 语法。在 AT&T中,%通常表示寄存器,而$保留用于立即数。如果您省略 th $,汇编器会将 48 解释为地址。

于 2012-02-08T15:57:00.110 回答