|
    Отличия 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 байт
movb %al,%ah
movw %ax,%bx
movl %ebx,%eax
Порядок операндов — вначале источник, затем приёмник, а не наоборот, как в синтаксисе Intel.
Например:
mov eax,ebx ( Intel )
movl %ebx,%eax ( AT&T )
числовые константы имеют следующую форму записи
20h ( Intel )
$0x20 ( AT&T, знак доллар в начале )
movl $0x10,%ebx ( AT&T )
для записи/считывания значения из определённого адреса в регистр знак доллара отсутствует
movl 0xffff,%eax
В синтаксисе AT&T длинные переходы и вызовы записываются как
lcall/ljmp $SECTION, $OFFSET
а в синтаксисе Intel call/jmp far SECTION:OFFSET
Также, инструкция дальнего возврата в синтаксисе AT&T пишется
lret $STACK-ADJUST
а в синтаксисе Intel ret far STACK-ADJUST
|