AArch64指令学习--总结

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

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

----------------指令学习----------------------------
B指令
BR指令:寄存器跳转
B.NE指令:向低地址跳转。
类似于jmp指令,之间跳转:
AArch64指令学习--总结_第1张图片
BL 指令进行调用:
在这里插入图片描述
MOV指令
LDR指令
STR指令
MOV为寄存器之间,LDR读取内存中数据保存到寄存器,STR读取寄存器中数据保存到内存。

AArch64指令学习--总结_第2张图片
ADRP指令
ADD指令
SUB指令
这些指令有时又三个操作数或四个操作数。
这两个指令经常连在一起:
ADRP指令获取页基址,保存到X0,add指令通过页基址+偏移获取到变量的地址。
在这里插入图片描述
在这里插入图片描述
表示的仅仅是: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-R2
4

STP指令
LDP指令

入栈指令和出栈指令,主要是可以操纵两个寄存器,
下图STP将X29和X30入栈到 sp+var_50的位置,然后将sp= sp+var_50(var_50可为正负数)
实际上并不是入栈,是内存地址的覆盖,sp+var_50 覆盖为x29,然后sp+var_50+0x8 覆盖为x30
AArch64指令学习--总结_第3张图片
指令后面没有!的情况,如图:
在这里插入图片描述
实际意义:将sp+0x20处依次覆盖为x4,x5,即sp+0x20覆盖为x4,sp+0x28覆盖为x5。最后sp的位置不变。

还需要注意这两种情况的区别:
在这里插入图片描述
区别在于中括号[],
前三条指令,sp都不改变位置,根据相应的偏移0x10 0x20 0x30 +上sp去寻址传递给相应的寄存器。
第四条指令表示的意思是,将sp 入栈到x29,sp+0x8 入栈到x30,然后sp=sp+0x40.

pwndbg> x/x $x30
pwndbg> x/x $lr

RET指令执行时刻,会寻找x30寄存器保存的地址值

你可能感兴趣的:(AArch64指令学习--总结)