Генерални регистри
Регистри
X0–X30
64-битни регистри
64-битни регистри
W0–W30
Доњих 32 бита X регистра
Доњих 32 бита X регистра
XZR/WZR
Нулти регистар (увек враћа 0)
Нулти регистар (увек враћа 0)
SP
Стек показивач
Стек показивач
X30
Линк регистар (LR)
Линк регистар (LR)
Приступ меморији
Основне инструкције
LDR X0, [X1]— Учитај 64-битну вредност са адресе из X1 у регистар X0STR W0, [X1]— Сачувај 32-битну вредност W0 на адресу у X1LDRB/LDRH— Учитај 8/16-битну вредност (без знака, виши битови = 0)LDRSB/LDRSH— Учитај 8/16-битну вредност са проширењем знакаSTRB/STRH— Сачувај 8/16-битну вредностLDP/STP— Учитај/сачувај пар регистара (најчешће са стеком)
Адресирање
LDR X0, [X1, #8]— Учитај са адресе X1 + 8LDR X0, [X1, X2(, LSL #2)]— Учитај са адресе X1 + X2(<< 2)LDR X0, [SP], #8— Учитај и повећај SP за 8LDR X0, [SP, #-8]!— Учитај са адресе SP - 8 и смањи SP за 8
Аритметика и битовске операције
Аритметичке инструкције
ADD X0, X1, X2— X0 = X1 + X2SUB X0, X1, X2— X0 = X1 - X2MUL X0, X1, X2— X0 = X1 * X2SDIV/UDIV— Означено/неозначено дељењеMSUB X0, X1, X2, X3— X0 = X3 - (X1 * X2)
Битовске операције
AND, ORR, EOR— Битовске операцијеLSL, LSR, ASR, ROR— Померања/ротације
Заставице (NZCV у PSTATE)
Заставице
N
Негативно
Негативно
Z
Нула
Нула
C
Неозначено прекорачење
Неозначено прекорачење
V
Означено прекорачење
Означено прекорачење
Инструкције које постављају заставице
ADDS, SUBS— ADD, SUB + заставицеCMP (упоређивање), TST (битовски тест)
Скокови и гранање
Основни скокови
B label— Безусловни скокBL label— Позив функцијеRET— Повратак (у X30 (LR))
Условни скокови
B.EQ label— Скок ако је једнако (Z==1)B.NE label— Скок ако није једнако (Z==0)B.LT, B.GT, B.LE, B.GE— Означени скоковиB.LO, B.HI, B.LS, B.HS— Неозначени скокови
Условно извршавање
Условне инструкције
CSEL X0, X1, X2, EQ— X0 = X1 ако Z==1, иначе X0 = X2CSINC X0, X1, X2, EQ— X0 = X1 ако Z==1, иначе X0 = X2 + 1CSINV X0, X1, XZR, EQ— X0 = X1 ако Z==1, иначе X0 = ~XZR = ~0 = -1
Конвенција за позив функција
Регистри за аргументе и повратну вредност
- X0–X7 — Први осам аргумената, остали преко стека
- X0 — Резултат функције
- X8 — Системски позив (индиректни)
Сачувани регистри
- X0–X15 — Caller-saved (чувају се пре позива)
- X16, X17 — Регистри за позив функција (X16=IP0, X17=IP1)
- X18 — Платформски регистар
- X19–X30 — Callee-saved (чувају се на почетку функције)
Поравнање стека
16-бајтно поравнање пре позива функције
Почетак функције
Нумеричка нотација (X29/X30):
STP X29, X30, [SP, #-16]!
MOV X29, SP
SUB SP, SP, #<size>
ABI алијаси (FP/LR):
STP FP, LR, [SP, #-16]!
MOV FP, SP
SUB SP, SP, #<size>
Крај функције
Нумеричка нотација (X29/X30):
MOV SP, X29
LDP X29, X30, [SP], #16
RET
ABI алијаси (FP/LR):
MOV SP, FP
LDP FP, LR, [SP], #16
RET
Компилација и дебаговање
Компилација
aarch64-linux-gnu-g++ file1.cpp file2.s -g -o program
Покретање емулатора и дебагера
QEMU терминал (емулација):
qemu-aarch64 -g 12345 ./program
*унос података*
GDB терминал (дебагер):
gdb-multiarch ./program
set architecture aarch64
target remote localhost:12345
break ime_funkcije
continue
Инструкције дебагера
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, итд.