Синтаксисы Intel и AT&T — это два разных способа записи ассемблерных инструкций для архитектуры x86/x64. Описывают одни и те же машинные команды, но по‑разному оформляют их в исходном коде. Ассемблеры, поддерживающие синтаксис AT&T GAS (GNU Assembler) — входит в комплект компиляторов GCC, используется в Unix-подобных системах. Синтаксис AT&T характерен для Unix-подобных систем, так как Unix изначально разрабатывался в AT&T Bell Labs LLVM Integrated Assembler (llvm-mc) — встроенный ассемблер инфраструктуры LLVM. Поддерживает синтаксис GAS и может использоваться как его прямая замена. Free Pascal (встроенный ассемблер) — для процессоров x86 Free Pascal использует AT&T-синтаксис во встроенном ассемблере, исторически опирается на GAS. AS (System V/386 Assembler) — ассемблер, давший название синтаксису. Разработан в AT&T Bell Labs для PDP-11 и унаследован в Unix-системах. В современных дистрибутивах Linux as символическая ссылка на GAS Rust (asm! macro) — встроенный ассемблер Rust использует LLVM IAS "под капотом" и по умолчанию работает в режиме .intel_syntax noprefix на x86, но поддерживает AT&T-синтаксис через опцию options(att_syntax) YASM (Yet Another Assembler) — первоначально задуман как переработка NASM. YASM кроссплатформенный, распространяется под лицензией BSD и поддерживает несколько форматов выходных файлов (ELF32/ELF64 (Linux/Unix), Mach‑O (macOS), COFF/MS COFF/MS64 COFF (Windows), RDOFF2, чистый бинарный файл). Поддерживает оба синтаксиса, выбор делается через опцию -p (например, -p gas). синтаксисIntelAT&TПорядок операндовdest, src (приёмник ← источник) imul ebx, eax, 69src, dest (источник → приёмник) imull $69, %eax, %ebxПрефикс регистровПросто имя: eax, ebxПеред регистровыми операндами всегда ставится %: 64-битные регистры %rax, %rbx, %rcx, %rdx, %rdi, %rsi, %rbp, %rsp, %r8-%r15 32-битные регистры %eax, %ebx, %ecx, %edx, %edi, %esi, %ebp, %esp, %r8d-%r15d 16-битных их младших половин: %ax, %bx, %cx, %dx, %di, %si, %bp, %sp, %r8w-%r15w. 8-битные регистры: %ah, %al, %bh, %bl, %ch, %cl, %dh, %dl, %dil, %sil, %bpl, %spl, %r8b-%r15b сегментные регистры %cs, %ds, %ss, %es, %fs, %gs. yпpавляющие регистры %cr0, %cr2 , %cr3. регистры отладки %db0, %db1, %db2, %db3, %db6 и %db7 тестовые регистры %tr6 и %tr7 регистры FPU: %st или %st(0), %st(1), %st(2), %st(3), %st(4), %st(5), %st(6) и %st(7) Размер операндаЗадаётся явно в операнде или подразумевается контекстом: mov eax, ebxСуффикс у команды: movl %ebx, %eax addl, subl, incl, decl, divl, imull, lcall (call far)/call (call near), ljmp (jmp far)/jmp (jmp near), lret (ret far)/ret (ret near), pushl, leal, andl, orl, xorl, cmpl b — байт (8-bit) w — слово (16-bit) l — двойное слово (32-bit) q — учетверенное слово (64-bit) x (128-bit vector) y (256-bit vector) z (512-bit vector) Константы mov rsi,11 (mov rsi,11d) mov rsi,1011b (mov rsi,1011y) mov rsi,0Bh mov rsi, 13o (mov rsi, 13q)использует $: десятичное: movq $11,%rsi двоичное: movq $0b1011, %rsi шестнадцатеричное: movq $0xb, rsi восьмеричное: movq $013,%rsi Адреса памятиКвадратные скобки: [ebx+4] [rbp-8]Круглые скобки, смещение перед регистром: 4(%ebx) -8(%rbp)Косвенная адресация/ переходы jmp eax jmp [addr] mov RDI,[RBX] jmp table[ecx*4] lea eax,[ebx+ecx]звёздочка для косвенности: jmp *%eax jmp *addr movq (%rbx), %rdi jmp *(table, %ecx, 4) leal (%ebx,%ecx),%eaxМасштабируемая индексация[ebx + ecx*4 + 8] база+индекс*масштаб+смещение8(%ebx, %ecx, 4) смещение (база, индекс, масштаб)ОСWindows, DOSLinux/UnixКомментарий однострочный; # //Комментарий многострочныйcomment/* */адрес переменной mov RSI, offset messageиспользует $: movq $message,%rsiпеременная mov count,ecxне использует $: movl %ecx,countТипы целочисленных данныхDB (BYTE, SBYTE) DW (WORD, SWORD) DD (DWORD, SDWORD) DQ (QWORD) OWORD.byte .short (.word) .long .quad .octaТипы вещественных данныхDD (REAL4) DQ (REAL8) DT (TBYTE, REAL10).float .double .tfloatПовторениеzeros dd 10 dup (0)zeros: .fill 10, 4, 0Определение константыintSize equ 4 имя = значение.equ intSize 4 имя = значениеОпределение данныхИмя тип значениеИмя: .тип значениеСтрока из символовHello db 'Hello, world!',0 Alphabet db 'abcdef'Hello: .asciz "Hello, world!" Alphabet: .ascii "abcdef" Внутри кавычек могут быть \n \t \rКоманды преобразования размераcbw cwde cwd cdq cdqe cqocbtw cwtl cwtd cltd cltq cqtoИсточники Using as AT&T-синтаксис — Википедия Встроенный ассемблер GCC Использование GNU ассемблера as.: Архитектурные особенности GCC-Inline-Assembly-HOWTO Директивы ассемблера GNU | arm | programming Руководство программиста Free Pascal ASM386 Macro Assembler Operating Instructions