Я прочитал эту страницу , содержащую хороший список различий между синтаксисом 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]
?
Я понимаю, что, вероятно, не принято указывать -только адрес смещения, но я хотел бы получить полное представление обо всех формах адресации памяти с помощью этого синтаксиса.