從ARMv8-A開始出現了64位的ARM指令集, ARM官方將64位的ARM指令集叫做Aarch64
Aarch64彙編中寄存器
Aarch64微處理器中,程序員可以使用31個64位的通用寄存器x0 ~ x30,堆棧指針寄存器sp,指令指針寄存器pc。也可以只使用這些通用寄存器中的低32位,即w0~w30,wsp。ARM遵循ATPCS規則,Aarch64彙編語言函數前8個參數使用x0-x7寄存器(或w0-w7寄存器)傳遞,多於8個的參數均通過堆棧傳遞,並且返回值通過x0寄存器(或w0寄存器)返回。
在使用軟中斷進行系統調時,系統調用號通過x8寄存器傳遞,用svc指令產生軟中斷,實現從用戶模式到管理模式的切換。例如:
mov x0, 123 // exit code
mov x8, 93 // sys_exit() is at index 93 in kernel functions table
svc #0 // generate kernel call sys_exit(123);
關於系統調用syscall的系統調用號索引可以查看這裏
https://elixir.bootlin.com/linux/latest/source/arch/sh/include/uapi/asm/unistd_64.h
Aarch64彙編語言
Aarch64彙編指令集所有指令的長度固定,每條指令是4字節(32位寬度),並且沒有Thumb指令集。
訪存指令
ARM32中的LDM、STM、PUSH、POP指令,在Aarch64中並不存在。取而代之的是LDP、STP指令,如一般在函數開頭用來代替PUSH.
例如,用IDA Pro逆向的某個Aarch64SO庫函數的開頭和結尾:
STP X24, X23, [SP,#var_40]!
STP X22, X21, [SP,#0x40+var_30]
STP X20, X19, [SP,#0x40+var_20]
STP X29, X30, [SP,#0x40+var_10]
ADD X29, SP, #0x40+var_10
....
SUB SP, X29, #0x30
LDP X29, X30, [SP,#0x150+var_120]
LDP X20, X19, [SP,#0x150+var_130]
LDP X22, X21, [SP,#0x150+var_140]
LDP X24, X23, [SP+0x150+var_150],#0x40
RET
參考文獻
arm64彙編語言
Wiki ARM Architecture
Aarch64 Register and Instruction Quick Start
ARM The Architecture for the Digital World
淺析基於ARM的Linux下的系統調用的實現