参考:https://blog.csdn.net/chi_wy/article/details/86236735
ARM64取消32位的LDM, STM, PUSH, POP指令. 与之替代的是 ldr/ ldp, str/ stp
ARM64里面 对栈的操作都是16进制对齐
ARM64下, 参数都是保存在x0-x7 (w0-w7) 这8个寄存器中, 如果超过这8个参数就会入栈, 函数的返回值是放在 x0寄存器中.
对于ARM32架构,函数调用时前4个参数用通用寄存器(R0-R3),剩余的用栈。
函数的局部变量都是保存在栈里面.
栈
栈就是指令执行时存放临时变量的内存空间,具有特殊的访问方式:后进先出, Last In Out Firt。
栈是从高地址到低地址存储数据的,栈底是高地址,栈顶是高地址。
FP指向栈底
SP指向栈顶
MOV
MOV X1,X0 ; 将寄存器X0的值传送到寄存器X1
STR
(store register)写入指令
将数据从寄存器中读出来, 写入到内存中
STR(条件) 源寄存器,<存储器地址>
STR R0, [R1] ,意思是R0-> [R1],源寄存器写在前面,跟MOV、LDR都相反。
ldr
(load register)读取指令
将数据从内存中读取出来, 存到寄存器中,LDR:通常都是作加载指令的,但是它也可以作伪指令
LDR r0,[r1] //将R1中的值存到r0中
LDR r1,[r2,#16] //将(r2+16)地址中的内容存到r1中
LDR r1,[r2],#4 //将r2地址中的内容存到r1中,同时r2=r2+4
ldp/stp
ldr/str 的衍生, 可以同时读/写两个寄存器, ldr/str只能读写一个
sub sp, sp, #0x20 ; 拉伸栈空间32(20 = 2*16)个字节
stp x0 , x1, [sp, #0x10] ; sp往上加16(10 = 1 * 16)个字节,存放x0 和 x1
ldp x1 , x0, [sp, #0x10] ; 将sp偏移16个字节的值取出来,放入x1 和 x0
CMP
cmp是比较指令,cmp的功能相当于减法指令。它不保存结果,只是影响相应的标志位
cmp指令格式: cmp 操作对象1, 操作对象2
mov al, 05h
mov bl, 08h
cmp al, bl (al - bl = -3h)
bl
跳转指令
ret
返回指令
ret {Xm}:跳转到由Xm目标寄存器指定的地址处。
其他
e : equal
ne : not equal
b: below
nb : not below
a : above
na : not above