使用GNU Assember Intel语法进行内存寻址

Ray*_*oal 8 assembly gnu-assembler intel-syntax

我读过这个页面,其中包含了针对GAS的英特尔和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
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,前两行是不同的.第一个将立即值8移动到rax中,第二个将地址8的内容移动到rax中.但是使用Intel语法我会得到以下奇怪的行为:

                         .text
                         .intel_syntax
0000 48C7C008000000      mov    %rax, 8
0007 48C7C008000000      mov    %rax, [8]
000e 4889F0              mov    %rax, %rsi
0011 488B06              mov    %rax, [%rsi]
Run Code Online (Sandbox Code Playgroud)

这里第一行和第二行汇编到相同的机器代码!首先我认为方括号是错误的,所以我在测试中添加了第三行和第四行,并且方括号对于内存寻址至少在涉及寄存器时起作用.

我读过的所有文档都显示了至少有一个基址或索引寄存器的内存寻址示例,有时还有一个比例和位移,但从不仅仅是位移.

我确实有使用NASM汇编程序的英特尔语法经验,它可以区分mov rax, 8mov rax, [8].

这是GAS中的错误吗?或者如果没有,我如何指定NASM的等效物mov rax, [8]

我意识到指定一个仅位移地址可能并不常见,但我希望通过这种语法完全理解所有内存寻址形式.

Mat*_*ery 7

确实存在这样的错误gas- 请参阅http://sourceware.org/bugzilla/show_bug.cgi?id=10637.

它似乎是在binutils 2.21.51中(或可能在之前)修复的.