🖥️ x86-64 Cheatsheet

Генерални регистри

64-битни регистри

RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8, R9, R10, ..., R15
Регистри опште намене
RIP
Показивач инструкција (адреса текуће инструкције)

Делови регистара

  • EAX, AX, AL — Доњих 32/16/8 бита од RAX
  • EDI, DI, DIL — Доњих 32/16/8 бита од RDI
  • R8D, R8W, R8B — Доњих 32/16/8 бита од R8
  • RSP — Показивач врха стека
  • RBP — Показивач почетка (базе) стека

Приступ меморији

Основне инструкције

  • MOV RAX, [RBX] — Учитај 64-битну вредност са адресе из RBX у RAX
  • MOV [RBX], EAX — Сачувај 32-битну вредност из EAX на адресу у RBX
  • LEA RAX, [RBX+4*RCX] — Учитај адресу RBX + 4*RCX у RAX

Режим адресирања

[base + index*scale + offset]

  • base — Базни регистар (RAX, RBX, итд.)
  • index — Индекс регистар (не може бити RSP)
  • scale — Множилац индекса (1, 2, 4, или 8)
  • offset — Константа

Аритметика и битовске операције

Аритметичке инструкције

  • ADD RAX, RBX — сабирање: RAX = RAX + RBX
  • SUB RAX, RBX — одузимање: RAX = RAX - RBX
  • IDIV, DIV RDI — означено и неозначено дељење: RAX = RDX:RAX / RDI (количник у RAX), RDX = RDX:RAX % RDI (остатак у RDX)
  • IMUL, MUL RDI — означено и неозначено множење: RDX:RAX = RAX * RDI
  • INC, DEC — Повећај / смањи за 1

Битовске операције

  • AND, OR, XOR, NOT — Битовске операције
  • SHL, SHR, SAR, ROL, ROR — Померања и ротације

Заставице (RFLAGS)

Важне заставице

CF
Неозначено прекорачење
PF
Парност
ZF
Нула
SF
Знак
OF
Означено прекорачење

Инструкције које постављају заставице

CMP (упоређивање), TEST (битовски тест), архметичке и битовске инструкције (ADD, SUB, AND, итд.)

Скокови и гранање

Основни скокови

  • JMP label — Безусловни скок
  • CALL label — Позив функције
  • RET — Повратак из функције

Условни скокови

  • JE/JZ, JNE/JNZ — Једнако/нула, није једнако/није нула
  • JL, JG, JLE, JGE - За означена поређења
  • JB, JA, JBE, JAE — За неозначена поређења

Конвенција за позив функција (x86-64 ABI)

Регистри за аргументе и повратну вредност

RDI
1. аргумент
RSI
2. аргумент
RDX
3. аргумент
RCX
4. аргумент
R8
5. аргумент
R9
6. аргумент

Сачувани регистри

  • RAX, RCX, RDX, RSI, RDI, R8–R11 — Caller-saved (губе се при позиву)
  • RBX, RBP, R12–R15 — Callee-saved (мора се сачувати функцијом)
  • RAX — Повратна вредност

Поравнање стека

16-бајтно поравнање пре позива функције (вредност RSP мора бити дељива са 16)

Почетак функције

Ручно:
PUSH RBP MOV RBP, RSP SUB RSP, <size>
Аутоматски:
ENTER <size>, 0

Крај функције

Ручно:
MOV RSP, RBP POP RBP RET
Аутоматски:
LEAVE RET

Компилација и дебаговање

Компилација

g++ file1.cpp file2.s -g -o program

Покретање

./program

Дебаговање са GDB

gdb ./program

Инструкције дебагера

  • run — Покрени програм
  • b ime_funkcije — Тачка прекида на функцији
  • b 0x400123 — Тачка прекида на адреси 0x400123
  • b file.cpp:10 — Тачка прекида на линији 10 у фајлу file.cpp
  • next — Следећа инструкција (без уласка у функције)
  • step — Следећа инструкција (са уласком у функције)
  • continue — Настави до следеће тачке прекида
  • print RAX — Прикажи вредност регистра RAX
  • backtrace — Прикажи стек позива функција
  • tui reg general — Прикажи регистре у TUI режиму
  • quit — Изађи из дебагера

💡 Већина инструкција може да се користи са кратким облицима: b за break, c за continue, итд.