Адресация памяти с помощью GNU Assember Intel Syntax

Я прочитал эту страницу , содержащую хороший список различий между синтаксисом Intel и AT&T для GAS, но он не охватывал случай указания адреса только со смещением.

Здесь я собрал четыре строки с синтаксисом 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. Но с синтаксисом Intel я получаю следующее странное поведение:

                        .text
                        .intel_syntax
0000 48C7C008000000      mov    %rax, 8
0007 48C7C008000000      mov    %rax, [8]
000e 4889F0              mov    %rax, %rsi
0011 488B06              mov    %rax, [%rsi]

Здесь первая и вторая строки собраны в один и тот же машинный код! Сначала я подумал, что квадратные скобки неправильные, поэтому добавил в тест третью и четвертую строки, и квадратные скобки действительно работают для адресации памяти, по крайней мере, когда задействованы регистры.

Вся документация, которую я читал, показывает примеры адресации памяти, по крайней мере, с базовым или индексным регистром, а иногда и с масштабом и смещением, но никогда только смещением.

У меня есть опыт работы с синтаксисом Intel на ассемблере NASM,который различает mov rax, 8и mov rax, [8].

Является ли это ошибкой в ​​GAS? Или, если нет, как указать эквивалент NASM mov rax, [8]?

Я понимаю, что, вероятно, не принято указывать -только адрес смещения, но я хотел бы получить полное представление обо всех формах адресации памяти с помощью этого синтаксиса.

8
задан Ray Toal 18 April 2012 в 17:48
поделиться