AT&T-синтаксис

Материал из Википедии — свободной энциклопедии
Версия от 09:44, 7 августа 2025; imported>Fuxx ({{нп3|X86 assembly language|Синтаксис ассемблера X86 в английской Википедии|en|X86 assembly language}})
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

AT&T-синтаксис — один из форматов записи мнемоники инструкций процессора.

Особенности

Отличия AT&T-ассемблера (gas) от Intel-ассемблера (MASM, TASM, FASM, NASM):

  • Комментарий начинается с символа «#», а не «;»; в свою очередь символ «;» разделяет команды и позволяет записывать несколько команд в одной строке.
  • Отсутствие префикса операнда указывает на адрес в памяти, поэтому movl $foo,%eax помещает адрес переменной foo в регистр %eax, а movl foo,%eax помещает в %eax содержимое переменной foo.
  • Имена регистров начинаются с символа %, то есть %eax, %dl, вместо eax, dl, и т. д. Это позволяет включать в код внешние переменные C, не опасаясь ошибок и не используя префиксов с подчёркиванием (_). Например:

%eax, %ebx, %ecx, %edx

  • Размер операнда определяется как суффикс имени инструкции. Суффиксы:
    • b (от byte) — операнды размером в 1 байт
    • w (от word) — операнды размером в 1 слово (2 байта)
    • l (от long) — операнды размером в 4 байта
    • q (от quad) — операнды размером в 8 байт
    • t (от ten) — операнды размером в 10 байт
    • o (от octo) — операнды размером в 16 байт

<syntaxhighlight lang="asm">

movb %al,%ah
movw %ax,%bx
movl %ebx,%eax

</syntaxhighlight>

  • Порядок операндов — вначале источник, затем приёмник, а не наоборот, как в синтаксисе Intel. Например:

<syntaxhighlight lang="asm">

mov eax,ebx ;(Intel)
movl %ebx,%eax #(AT&T)

</syntaxhighlight>

  • числовые константы имеют следующую форму записи:

<syntaxhighlight lang="asm">

20h ;(Intel)
$0x20 #(AT&T, знак доллар в начале)
mov ebx, 10h ;(Intel)
movl $0x10,%ebx #(AT&T)

</syntaxhighlight>

  • для записи/считывания значения из определённого адреса в регистр знак доллара отсутствует:

<syntaxhighlight lang="asm"> movl 0xffff,%eax</syntaxhighlight>

  • сегмент.смещение (только в реальном режиме) :

<syntaxhighlight lang="asm">

00:0FFh ;(Intel)
00.$0xFF #(AT&T)

</syntaxhighlight>

  • регистр.смещение :

<syntaxhighlight lang="asm">

es:[bx+0x1a] ;(Intel)
%es.0x1a(%bx) #(AT&T)

</syntaxhighlight>

Указания на индексные методы адресации отличаются тем, что используются круглые, а не квадратные скобки:

<syntaxhighlight lang="asm">

sub eax,[ebx+ecx*4h-20h] ;(Intel)
subl -0x20(%ebx,%ecx,0x4),%eax #(AT&T) вычесть из EAX значение (ECX * 4) + EBX - 32

</syntaxhighlight>

Отличаются мнемоники некоторых команд (например, cdq называется cltd в AT&T).

Отличаются команды ассемблера (такие, как объявление констант, резервирование места).

См. также