Синтаксис AT&T
Синтаксис AT&T або 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 байт
movb %al,%ah
movw %ax,%bx
movl %ebx,%eax
- Порядок операндів — спочатку джерело, потім приймач, а не навпаки, як в синтаксисі Intel. Наприклад:
mov eax,ebx (Intel) movl %ebx,%eax (AT&T)
- числові константи мають таку форму запису
20h (Intel) $0x20 (AT&T, знак "долар" на початку)
mov ebx, 10h (Intel) movl $0x10,%ebx (AT&T)
- для запису/зчитування значення з певної адреси в регістр знак долара відсутній
movl 0xffff,%eax
- сегмент.зміщення (тільки в реальному режимі) :
00:0FFh (Intel) 00.$0xFF (AT&T)
- регістр.зміщення :
es:[bx+0x1a] (Intel) %es.0x1a(%bx) (AT&T)
Вказівки на індексні методи адресації відрізняються тим, що використовуються круглі, а не квадратні дужки:
sub eax,[ebx+ecx*4h-20h] (Intel) subl -0x20(%ebx,%ecx,0x4),%eax (AT&T) # відняти від EAX значення (ECX * 4) + EBX - 32
Відрізняються мнемоніки деяких команд (наприклад, cdq називається cltd в AT&T).
Відрізняються команди асемблера (такі, як оголошення констант, резервування місця).
- Книга з асемблера в Linux у Вікіпідручнику (рос.)
- Використання асемблера в Linux (англ.)