🔩 Ассемблер (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 имеют другие наборы инструкций).