Сравнение синтаксисов Intel и AT&T

Тема в разделе "GAS/AT&T", создана пользователем Mikl___, 11 сен 2026 в 12:29.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.281
    Синтаксисы 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, 69
    src, 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
    cqo
    cbtw
    cwtl
    cwtd
    cltd
    cltq
    cqto
    Источники
     

    Вложения:

    Последнее редактирование: 12 сен 2026 в 04:58
    MaKsIm нравится это.