Описание тега att
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 в сборке?.
- NASM Vs GAS (Практические отличия)
- Что мне не нравится в GAS, объясняет синтаксис AT&T и NASM и MASM на примерах, указывая на некоторые причины, по которым некоторым людям неприятно писать от руки.
- http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax.
- http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm Подробнее о синтаксисе Intel и AT&T.
Канонические вопросы и ответы:
- x64: почему этот фрагмент кода выдает "ошибку границы адреса"
mov 1, %reg
это загрузка с абсолютного адреса 1 и неисправности.mov $1, %reg
является mov-немедленным. - Какая разница между числом с символом $ или без символа $ в синтаксисе сборки at&t? - использовать
mov $foo, %ecx
получить адрес в реестре. - сборка x86 - печать символа с кодом ascii (
mov $symbol, %ecx
настроить для системного вызова записи, а неmov symbol, %ecx
) - Сборка, x86: Как запихнуть метку в стек?-
push $foo
неpush foo