Синтаксис 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 директива. Посмотрите тег Wiki.

См. также тег Wiki для больше о x86 архитектуре и блоке в целом. Посмотрите, что тег Wiki для больше о GNU C встраивает asm.


синтаксис x87 разрабатывает ошибку / несовместимость с синтаксисом Intel:

Синтаксис 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 делает в блоке?.