🔧 ARM64 Cheatsheet

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

Регистри

X0–X30
64-битни регистри
W0–W30
Доњих 32 бита X регистра
XZR/WZR
Нулти регистар (увек враћа 0)
SP
Стек показивач
X30
Линк регистар (LR)

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

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

  • LDR X0, [X1] — Учитај 64-битну вредност са адресе из X1 у регистар X0
  • STR W0, [X1] — Сачувај 32-битну вредност W0 на адресу у X1
  • LDRB/LDRH — Учитај 8/16-битну вредност (без знака, виши битови = 0)
  • LDRSB/LDRSH — Учитај 8/16-битну вредност са проширењем знака
  • STRB/STRH — Сачувај 8/16-битну вредност
  • LDP/STP — Учитај/сачувај пар регистара (најчешће са стеком)

Адресирање

  • LDR X0, [X1, #8] — Учитај са адресе X1 + 8
  • LDR X0, [X1, X2(, LSL #2)] — Учитај са адресе X1 + X2(<< 2)
  • LDR X0, [SP], #8 — Учитај и повећај SP за 8
  • LDR X0, [SP, #-8]! — Учитај са адресе SP - 8 и смањи SP за 8

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

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

  • ADD X0, X1, X2 — X0 = X1 + X2
  • SUB X0, X1, X2 — X0 = X1 - X2
  • MUL X0, X1, X2 — X0 = X1 * X2
  • SDIV/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 = X2
  • CSINC X0, X1, X2, EQ — X0 = X1 ако Z==1, иначе X0 = X2 + 1
  • CSINV 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 — Тачка прекида на адреси 0x400123
  • b file.cpp:10 — Тачка прекида на линији 10 у фајлу file.cpp
  • next — Следећа инструкција (без уласка у функције)
  • step — Следећа инструкција (са уласком у функције)
  • continue — Настави до следеће тачке прекида
  • print RAX — Прикажи вредност регистра RAX
  • backtrace — Прикажи стек позива функција
  • tui reg general — Прикажи регистре у TUI режиму
  • quit — Изађи из дебагера

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