AARCH64

First Post:

Last Update:

Word Count:
471

Read Time:
1 min

AARCH64

—————寄存器学习——————–
33个寄存器:
X0X30, SP(X31)和PC
W0 ~ W31分别是X0
X31的低32位

SP:通过SP寄存器确定参数和变量的位置。
X0:保存函数的返还结果。
X0X7:用于传递子程序参数,多余参数采用堆栈传递
X9
X15:临时寄存器,使用时不需要保存
X29 FP:此寄存器指向栈低。
X30 LR:用于保存子程序返回地址,
x31 SP:通过SP寄存器确定参数和变量的位置。
x32 PC:寄存器,记录当前指令是那一条

B指令
BR指令:寄存器跳转
B.NE指令:向低地址跳转。
类似于jmp指令,之间跳转:

BL 指令进行调用

MOV指令
LDR指令
STR指令
MOV为寄存器之间,LDR读取内存中数据保存到寄存器,STR读取寄存器中数据保存到内存。

ADRP指令
ADD指令
SUB指令
这些指令有时又三个操作数或四个操作数。
这两个指令经常连在一起:
ADRP指令获取页基址,保存到X0,add指令通过页基址+偏移获取到变量的地址。

sub x1, x1, x16

表示: x1= x1- x16。

ASR #n 算术右移n 位(1≤n≤32)
LSL #n 逻辑左移n 位(1≤n≤31)
LSR #n 逻辑左移n 位(1≤n≤32)
ROR #n 循环右移n 位(1≤n≤31)
举例:
ADD R1,R1,R1,LSL #3 ;R1=R19
SUB R1,R1,R2,LSR#2 ;R1=R1-R24

STP指令
LDP指令
入栈指令和出栈指令,主要是可以操纵两个寄存器,
下图STP将X29和X30入栈到 sp+var_50的位置,然后将sp= sp+var_50(var_50可为正负数)
实际上并不是入栈,是内存地址的覆盖,sp+var_50 覆盖为x29,然后sp+var_50+0x8 覆盖为x30

ref: https://blog.csdn.net/qq_39869547/article/details/105037770

ref: https://www.pianshen.com/article/6301588/

ref: https://developer.arm.com/documentation/102374/0101/Registers-in-AArch64---general-purpose-registers

打赏点小钱
支付宝 | Alipay
微信 | WeChat