我阅读了这个页面,其中列出了 GAS 的 Intel 和 AT&T 语法之间的差异,但它没有涵盖仅指定具有位移的地址的情况。
在这里,我用 AT&T 语法组装了四行:
.text
0000 48C7C008000000 mov $8, %rax
0007 488B042508000000 mov (8), %rax
000f 4889F0 mov %rsi, %rax
0012 488B06 mov (%rsi), %rax
正如预期的那样,前两行是不同的。第一个将立即数 8 移入 rax,第二个将地址 8 的内容移入 rax。但是使用英特尔语法,我得到以下奇怪的行为:
.text
.intel_syntax
0000 48C7C008000000 mov %rax, 8
0007 48C7C008000000 mov %rax, [8]
000e 4889F0 mov %rax, %rsi
0011 488B06 mov %rax, [%rsi]
这里第一行和第二行组装成相同的机器代码!首先我认为方括号是错误的,所以我在测试中添加了第三和第四行,至少在涉及寄存器时,方括号确实可以用于内存寻址。
我读过的所有文档都显示了内存寻址示例,其中至少有一个基址或索引寄存器,有时还有比例和位移,但绝不是只有位移。
我确实有使用 NASM 汇编器的英特尔语法的经验,它确实区分mov rax, 8
和mov rax, [8]
.
这是 GAS 中的错误吗?或者如果不是,我如何指定 NASM 的等价物mov rax, [8]
?
我意识到指定仅位移地址可能并不常见,但我想使用这种语法全面了解所有内存寻址形式。