One
数据存取
cpu先将数据存储到低32位寄存器 x0-x28 fp lr sp
pc寄存器
指向 当前要执行的指令
SP寄存器
Arm64位寄存器占8个字节
栈:程序从内存中开辟空间时 从高地址往低地址开辟。 堆:从低地址向高地址开辟
在哪里 那里就是栈。32位POP PUSH已经取消了 读/写数据都是往高地址读写 str 将数据从寄存器读出来,写到内存中 Stp 可以操作两个寄存器 ldr 相反
.text
.global _A
_A:
sub sp,sp,#20; //sp寄存器的内存地址减32
stp x0,x1,[sp,#0x10]; //将x0 x1寄存器的值 存到 sp地址+0x10的 内存区域。arm64 一个寄存器占8个字节
ldp x1,x0,[sp,#0x10]; //将位于sp地址+0x10 的内存区域的值,存到x1 x0寄存器内
add sp,sp,#20; //复位
ret
FP寄存器
很少用
bl和ret
bl 将下一条指令的地址放到lr(x30)寄存器 即:返回地址 转到福好处执行指令
ret 跳转到lr(x30)地址 的地方
函数的参数和局部变量
叶子函数不用开辟栈空间 arm64下,函数的参数存放在x0-x7中,如果参数个数超过8就要入栈。 函数的返回值是放在x0寄存器内