在x86汇编中,美元($)和百分比(%)符号代表什么?

时间:2012-02-08 15:47:56

标签: assembly x86 att

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

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

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

5 个答案:

答案 0 :(得分:22)

这不是英特尔语法,而是AT&T syntax,也称为GAS syntax

$前缀用于immediates(常量),%前缀用于寄存器(它们必需 1 )。< / p>

有关AT&amp; T语法的更多信息,另请参阅the [att] tag wiki


1 除非指定noprefix选项,否则请参阅here&amp; here。但通常noprefix仅与.intel_syntax noprefix一起使用,以获得类似MASM的语法。

答案 1 :(得分:2)

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

的偏移量为32

答案 2 :(得分:2)

与英特尔语法相比,AT&amp; T语法有很多差异

  • $表示常量(整数字面值)。没有它,数字是绝对地址
  • %表示注册
  • 源/目的地顺序颠倒
  • ()用于内存引用,例如英特尔语法
  • 中的[]

所以上面的代码段相当于

sub esp, 48         ; esp -= 48
mov [esp+32], eax   ; store eax to the value at the address `esp + 32`

答案 3 :(得分:1)

正如@Necrolis所说,那是用AT&amp; T语法编写的。这意味着:

subtract 48 from the register esp (the stack pointer).
store the contents of eax to the four bytes starting at (esp + 32).

答案 4 :(得分:0)

这是x86的AT&amp; T语法。在AT&amp; T %中通常表示寄存器,而$则为临时表示。如果省略$,汇编器会将48解释为地址。