【发布时间】:2012-03-01 02:02:28
【问题描述】:
我正在尝试了解汇编语言如何用于微型计算机体系结构类,并且在示例中我一直面临不同的语法:
sub $48, %esp
mov %eax, 32(%esp)
这些代码是什么意思? esp寄存器的32个操作数是什么?
【问题讨论】:
我正在尝试了解汇编语言如何用于微型计算机体系结构类,并且在示例中我一直面临不同的语法:
sub $48, %esp
mov %eax, 32(%esp)
这些代码是什么意思? esp寄存器的32个操作数是什么?
【问题讨论】:
这不是 Intel 语法,它的 AT&T syntax,也称为 GAS syntax。
$ 前缀用于立即数(常量),% 前缀用于寄存器(它们是必需的1)。
有关 AT&T 语法的更多信息,另请参阅 the [att] tag wiki。
1 除非指定了noprefix 选项,否则请参阅here 和here。但通常noprefix 只与.intel_syntax noprefix 一起使用,以获得类似MASM 的语法。
【讨论】:
noprefix指令stackoverflow.com/questions/549347/…,则不需要%前缀
与 Intel 语法相比,AT&T 语法有很多不同
$ 表示一个常量(整数文字)。没有它,数字是一个绝对地址% 表示寄存器() 用于内存引用,如 Intel 语法中的 []
所以上面的sn-p等价于
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 中,% 通常表示寄存器,而$ 保留用于立即数。如果省略 $,汇编器会将 48 解释为地址。
【讨论】: