Генерални регистри
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 у RAXMOV [RBX], EAX— Сачувај 32-битну вредност из EAX на адресу у RBXLEA 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 + RBXSUB RAX, RBX— одузимање:RAX = RAX - RBXIDIV, DIV RDI— означено и неозначено дељење:RAX = RDX:RAX / RDI(количник у RAX),RDX = RDX:RAX % RDI(остатак у RDX)IMUL, MUL RDI— означено и неозначено множење:RDX:RAX = RAX * RDIINC, 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. аргумент
1. аргумент
RSI
2. аргумент
2. аргумент
RDX
3. аргумент
3. аргумент
RCX
4. аргумент
4. аргумент
R8
5. аргумент
5. аргумент
R9
6. аргумент
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— Тачка прекида на адреси0x400123b file.cpp:10— Тачка прекида на линији10у фајлуfile.cppnext— Следећа инструкција (без уласка у функције)step— Следећа инструкција (са уласком у функције)continue— Настави до следеће тачке прекидаprint RAX— Прикажи вредност регистраRAXbacktrace— Прикажи стек позива функцијаtui reg general— Прикажи регистре у TUI режимуquit— Изађи из дебагера
💡 Већина инструкција може да се користи са кратким облицима:
b за break, c за
continue, итд.