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

jul*_*aad 26 x86 assembly att

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

sub $48, %esp
mov %eax, 32(%esp)
Run Code Online (Sandbox Code Playgroud)

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

Nec*_*lis 24

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

$前缀是立即数(常数),并且%前缀为寄存器(它们需要1).

欲了解更多有关AT&T语法,也看到[att]标签的wiki.


1除非noprefix指定了选项,否则请参阅此处此处.但通常noprefix只用于.intel_syntax noprefix获得类似MASM的语法.

  • 如果使用“noprefix”指令,则不需要“%”前缀http://stackoverflow.com/questions/549347/how-to-use-address-constants-in-gcc-x86-inline-assemble (2认同)

phu*_*clv 8

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

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

所以上面的片段相当于

sub esp, 48         ; esp -= 48
mov [esp+32], eax   ; store eax to the value at the address `esp + 32`
Run Code Online (Sandbox Code Playgroud)