关于内存读写指令
注意:读/写 数据是都是往高地址读/写
str(store register)指令
将数据从寄存器中读出来,存到内存中.
ldr(load register)指令
将数据从内存中读出来,存到寄存器中
此ldr 和 str 的变种ldp 和 stp 还可以操作2个寄存器.
sub sp, sp, #0x40 ; 拉伸0x40(64字节)空间
stp x29, x30, [sp, #0x30] ;x29\x30 寄存器入栈保护
add x29, sp, #0x30 ; x29指向栈帧的底部
...
ldp x29, x30, [sp, #0x30] ;恢复x29/x30 寄存器的值
add sp, sp, #0x40 ; 栈平衡
ret
if语句判断的指令集
cmp比较指令
CMP 把一个寄存器的内容和另一个寄存器的内容或立即数进行比较。但不存储结果,只是正确的更改标志。
一般CMP做完判断后会进行跳转,后面通常会跟上B指令!
- BL 标号:跳转到标号处执行
- B.GT 标号:比较结果是大于(greater than),执行标号,否则不跳转
- B.GE 标号:比较结果是大于等于(greater than or equal to),执行标号,否则不跳转
- B.EQ 标号:比较结果是等于,执行标号,否则不跳转
- B.HI 标号:比较结果是无符号大于,执行标号,否则不跳转
- B.LT标号: 比较结果小于,执行标号,否则不跳转
- B.LE标号:比较结果小于等于,执行标号,否则不跳转
- B.NE 标号:比较结果是不等于(not equal to),执行标号,否则不跳转
- B.LO标号:比较结果是无符号小于,执行标号,否则不跳转
- B.HS标号:比较结果是无符号大于等于,执行标号,否则不跳转
- B.LS标号:比较结果是无符号的小于等于,执行标号,否则不跳转
我使用的比较语句却是SUBS 指令
CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。在进行两个数据的大小判断时,常用CMP指令及相应的条件码来操作
br
根据你寄存器所存的值进行跳转
ubfx
ubfx x9 ,x9,#0,#32
将x9的高32位清零
adrp
adrp x0 1
add x0,x0,#0xf69
个人看法就是将x0里面的值后三位清零第四位加一,在加上下一行的f69 假设adrp那一行的指针后四位一开始为45f8 那adrp那一行就是将45f8变成5000然后赋值于x0 然后add那一行就是将x0变为5f69
ldrsw
ldrsw x10,[x8,x11,lsl,#2]
这句话的意识是 先将x11的值左移(lsl)两位,在加上x8等到的结果作为地址取值赋值给x10
SP和FP寄存器
sp寄存器在任意时刻会保存我们栈顶的地址.
fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用它保存栈底的地址!