🔩 Ассемблер (x86-64)

Регистры, инструкции, переходы, стек, вызовы и системные вызовы.

Шпаргалки · Программирование · #assembler #asm #x86 #nasm

IDE и сборка

Ассемблеры: NASM, GAS (GNU), MASM, FASM. Отладка: GDB, x64dbg, Visual Studio. Сборка Linux: nasm -f elf64 a.asm && ld a.o -o a. Разбор готового кода: objdump -d, gdb.

Типы данных и размеры

Директива Размер
db 1 байт
dw 2 байта
dd 4 байта
dq 8 байт
resb, resq зарезервировать место (секция .bss)

Секции: .text (код), .data (данные), .bss (нули).

Регистры

Регистры Назначение
rax (eax, ax, al) результат, номер syscall
rbx, rcx, rdx общие, rcx счётчик
rsi, rdi источник / приёмник
rsp, rbp вершина стека / база кадра
r8–r15 дополнительные
rip указатель команд

Инструкции

mov  rax, 5          ; присвоить
add  rax, rbx        ; сложить
sub  rax, 1
imul rax, rbx        ; умножить
xor  rax, rax        ; обнулить
inc  rcx
cmp  rax, rbx        ; сравнить, ставит флаги
push rax             ; в стек
pop  rbx             ; из стека
lea  rax, [rbx+8]    ; адрес

Условия и циклы

    mov rcx, 3
loop_start:
    ; тело
    dec rcx
    jnz loop_start       ; прыжок, пока не ноль
    cmp rax, rbx
    je  equal            ; равно (jne, jg, jl, jge, jle)
    jmp done

Функции (System V, Linux)

Аргументы: rdi, rsi, rdx, rcx, r8, r9; результат в rax.

add_two:
    mov rax, rdi
    add rax, rsi
    ret
; вызов: mov rdi, 1 / mov rsi, 2 / call add_two

Системные вызовы (Linux)

section .data
msg db "Hello", 10
section .text
global _start
_start:
    mov rax, 1       ; write
    mov rdi, 1       ; stdout
    mov rsi, msg
    mov rdx, 6
    syscall
    mov rax, 60      ; exit
    xor rdi, rdi
    syscall

Где применяют

Загрузчики, драйверы, оптимизация, реверс-инжиниринг, безопасность, встроенные системы (ARM и AVR имеют другие наборы инструкций).