我试图了解汇编语言如何适用于微型计算机体系结构类,并且我在示例中仍然面对不同的语法:
sub $48, %esp
mov %eax, 32(%esp)
这些代码是什么意思?什么是32操作数和esp寄存器的添加?
答案 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解释为地址。