Синтаксис AT&T является синтаксисом блока, используемым в средах UNIX, который порождает из AT&T Bell Labs. Это происходит от синтаксиса блока MIPS.
Синтаксис AT&T является синтаксисом блока, используемым главным образом в средах UNIX или инструментами как gcc, который произошел в той среде. GNU (gcc/binutils) выбрал синтаксис AT&T для совместимости с синтаксисом ассемблера Unix Bell Labs AT&T для 386. Это в свою очередь основывало его дизайн синтаксиса на ассемблере PDP-11 PAL-11. (См. также: Вопросы о дизайне синтаксиса AT&T x86 и Какова была исходная причина дизайна синтаксиса блока AT&T?)
Это используется ассемблером GNU и некоторыми совместимыми инструментами как встроенный ассемблер лязга. Эти инструменты все также используют директивы ассемблера GNU как .globl main
и .byte 0x12
вместо db 12h
. См. руководство GAS.
Большинство инструментов, что значение по умолчанию к синтаксису AT&T имеет опции использовать подобный MASM GNU Intel Syntax. gcc -masm=intel -S
или objdump -drwC -Mintel
. Или в GAS, .intel_syntax noprefix
директива. Посмотрите синтаксис Intel тег Wiki.
См. также x86 тег Wiki для больше о x86 архитектуре и блоке в целом. Посмотритевстроенный ассемблерный код, что тег Wiki для больше о GNU C встраивает asm.
Синтаксис AT&T инвертирует мнемонику для fsubr
и fsub
, и другие некоммутативные x87 инструкции как fdivr
, когда место назначения %st(i)
. Посмотрите запись руководства GAS. Инструменты как objdump -d
это демонтирует в синтаксисе AT&T, также совместимы с этой мнемосхемой-> отображение кода операции. См. также Objdump, подкачивающий fsubrp к fsubp на скомпилированном блоке?
Современная версия objdump -d -Mintel
используйте интерпретацию синтаксиса Intel мнемоники как ожидалось. (Примечание редактора: Я, кажется, вспоминаю более старые версии objdump и/или GAS в режиме синтаксиса Intel все еще с помощью AT&T совместимая с ошибкой мнемоника.)
Детали синтаксиса
Операнды находятся в целевом последнем порядке, реверсе синтаксиса Intel (используются в руководствах Intel/AMD). Например, pshufd $0xE4, %xmm0, %xmm1
перестановки xmm0
и помещает результат в xmm1
. (Синтаксис Intel pshufd xmm1, xmm0, 0E4h
. Для перевода в синтаксис Intel всегда инвертируйте список операндов.
Имена регистра снабжаются префиксом %
, и immediates снабжаются префиксом $
. Размер операнда обозначается с a b/w/l/q
суффикс на мнемосхеме, но является дополнительным, если это не подразумевается операндом регистра, тот же путь который dword
или dword ptr
является дополнительным в NASM. Способы адресации используют полностью другой синтаксис, disp(base, idx, scale)
Примеры:
sub $24, %rsp
резервы 24 байта на стеке.mov foo, %eax
загрузка из адреса символа foo
.mov $foo, %rax
вставляет тот адрес %rax
(mov-imm32)lea foo(%rip), %rax
(только 64-разрядный режим) режим относительной адресации RIP для PIC (позиционно-независимый) код.movabs $0x123456789ABCDEF, %rax
imm64 или 64-разрядные абсолютные формы адреса памяти mov
используйте movabs
мнемосхема в синтаксисе AT&T.imul $13, 16(%rdi, %rcx, 4), %eax
32-разрядная загрузка из rdi + rcx<<2 + 16
, умножьте это на 13, вставьте результат %eax
. Intel imul eax, [16 + rdi + rcx*4], 13
.addb $1, byte_table(%rdi)
увеличьте байт в статической таблице. (disp32+base способ адресации, таким образом, это - технически не режим индексной адресации). Суффикс размера операнда обязателен здесь, потому что никакой операнд не является регистром для допущения размера.addl $1, dword_table(, %rdi, 4)
увеличьте dword в статической таблице. (disp32 + способ адресации масштабированного индекса без базового регистра).movswl (%rdi), %eax
расширяющая знак загрузка из слова (w
) к dword (l
). Intel movsx eax, word [rdi]
. AT&T нужна другая мнемоника для каждого исходного размера movzx / movsx. Что инструкция MOVZBL делает в синтаксисе AT&T IA-32? и что делает movsbl инструкция?.cltq
= cdqe
в Intel, cltd
= cdq
. Они (и связанные инструкции для других размеров) знак расширяются в eax/rax или от eax в edx:eax (или rax
в rdx:rax
). Ассемблер GNU принимает более - читаемая мнемоника Intel, где в - потягиваются, версия всегда заканчивается e
(за исключением cbw
). Посмотрите то, Что cltq делает в блоке?.