Синтаксис AT&T - это синтаксис ассемблера, используемый в средах UNIX, разработанный AT&T Bell Labs. Он происходит от синтаксиса сборки MIPS.

AT&T Syntax - это синтаксис сборки, используемый в основном в средах UNIX или такими инструментами, как gcc, которые возникли в этой среде. GNU (gcc/binutils) выбрал синтаксис AT&T для совместимости с синтаксисом ассемблера Unix от AT&T Bell Labs для 386. Это, в свою очередь, основывало свой синтаксис на ассемблере PDP-11 PAL-11. (См. Также: Вопросы о разработке синтаксиса AT&T x86 и Какова первоначальная причина разработки синтаксиса сборки AT&T?)

Он используется ассемблером GNU и некоторыми совместимыми инструментами, такими как встроенный ассемблер clang. Все эти инструменты также используют директивы ассемблера GNU, такие как.globl main а также .byte 0x12 вместо того db 12h. См. Руководство GAS.

Большинство инструментов, которые по умолчанию используют синтаксис AT&T, могут использовать MASM-подобный синтаксис GNU Intel. gcc -masm=intel -S или objdump -drwC -Mintel. Или в ГАЗ,.intel_syntax noprefixэто директива. См. Вики по тегам intel-syntax.

Смотрите также на x86 теги вики больше об архитектуре x86 и сборки в целом. Дополнительную информацию о встроенном asm GNU C см. В вики -странице тегов встроенной сборки.


Ошибка разработки синтаксиса 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. (Синтаксис Intelpshufd xmm1, xmm0, 0E4h. Для перевода в / из синтаксиса Intel всегда меняйте список операндов в обратном порядке.

Имена регистров начинаются с префикса %, а перед непосредственными сообщениями стоит префикс $. Размер операнда обозначен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 (позиционно-независимого) кода. ( Как загрузить адрес функции или метку в регистр в GNU Assembler и что делает "mov offset(%rip), %rax"?)
  • movabs $0x123456789ABCDEF, %rax imm64 или 64-битные формы абсолютного адреса памяти mov использовать movabs мнемоника в синтаксисе AT&T.
  • imul $13, 16(%rdi, %rcx, 4), %eax 32-битная загрузка из rdi + rcx<<2 + 16, умножьте это на 13, поместите результат в %eax. Intelimul eax, [16 + rdi + rcx*4], 13.
  • addb $1, byte_table(%rdi) увеличить байт в статической таблице. (режим адресации disp32+base, поэтому технически это не режим индексированной адресации). Суффикс размера операнда здесь является обязательным, потому что ни один из операндов не является регистром для обозначения размера.
  • addl $1, dword_table(, %rdi, 4)увеличить двойное слово в статической таблице. (режим адресации disp32 + с масштабированным индексом без базового регистра).
  • movswl (%rdi), %eax знак-расширяющая нагрузка от слова (w) в dword (l). Intelmovsx eax, word [rdi]. AT&T требует различных мнемоник для каждого размера исходного файла movzx / movsx. Что делает инструкция MOVZBL в синтаксисе IA-32 AT&T? а что делает инструкция movsbl?.
  • cltq знак равно cdqe в Intel, cltd знак равно cdq. Они (и соответствующие инструкции для других размеров) простираются внутри eax/rax или от eax до edx:eax (илиrax в rdx:rax). Ассемблер GNU принимает более удобочитаемую мнемонику Intel, где версия внутри rax всегда заканчивается наe (кроме cbw). См. Что делает cltq в сборке?.


Канонические вопросы и ответы: