Комментарий начинается с символа «#», а не «;»; в свою очередь символ «;» разделяет команды и позволяет записывать несколько команд в одной строке.
Отсутствие префикса операнда указывает на адрес в памяти, поэтому
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 байт
movb%al,%ahmovw%ax,%bxmovl%ebx,%eax
Порядок операндов — вначале источник, затем приёмник, а не наоборот, как в
синтаксисе Intel
. Например:
moveax,ebx;(Intel)movl%ebx,%eax#(AT&T)
числовые константы имеют следующую форму записи:
20h;(Intel)$0x20#(AT&T, знак доллар в начале)movebx,10h;(Intel)movl$0x10,%ebx#(AT&T)
для записи/считывания значения из определённого адреса в регистр знак доллара отсутствует:
movl0xffff,%eax
сегмент.смещение (только в реальном режиме) :
00:0FFh;(Intel)00.$0xFF#(AT&T)
регистр.смещение :
es:[bx+0x1a];(Intel)%es.0x1a(%bx)#(AT&T)
Указания на индексные методы адресации отличаются тем, что используются круглые, а не квадратные скобки:
subeax,[ebx+ecx*4h-20h];(Intel)subl-0x20(%ebx,%ecx,0x4),%eax#(AT&T) вычесть из EAX значение (ECX * 4) + EBX - 32
Отличаются мнемоники некоторых команд (например,
cdq
называется
cltd
в AT&T).
Отличаются команды ассемблера (такие, как объявление констант, резервирование места).