Aarch64彙編語言

從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下的系統調用的實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章