本帖最后由 ggggmllll 于 2022-11-19 09:35 编辑
AAPCS64即Aarch64过程调用标准,描述了在ARM 64位体系结构下应用程序二进制接口(ABI)在过程调用中应遵循的调用约束,涉及寄存器使用规则、栈布局、函数传参以及保存返回值等内容
1,寄存器
ARM 64位处理器中包含了31个64位通用寄存器,依次为r0-r30:在64位上下文中,使用x0-x30的命名引用寄存器,即读写完整的64位;在32位上下文中使用w0-w30的命名来使用寄存器,即仅读写32位
此外,处理器还提供了栈指针寄存器(sp)。对于所有基本程序执行寄存器在过程调用中的作用描述如下所示:
r0~r7:函数参数传递
r29:帧指针寄存器,存放当前过程调用栈帧的起始地址,可使用FP别名引用
r30:链接寄存器,用于保存函数调用的返回地址,可使用LR别名引用
sp:栈指针寄存器,指向当前堆栈的栈顶
pc:当前执行指令的地址。它是由执行的指令的大小递增的,通常是四个字节,在AArch64状态,PC不能被直接访问
pstate:处理状态或pstate是处理状态信息的抽象
2,运行时堆栈
堆栈是内存的连续区域,可用于存储过程调用中的寄存器状态、局部变量,并在没有足够的参数寄存器可用时传递多余的其它参数,和arm32一样,都是满递减堆栈,详见下图:
3,参数传递
Aarch64同时支持使用寄存器或堆栈进行参数传递。Aarch64标准提供了8个通用寄存器(r0-r7)用于传递函数参数,依次对应于参数1~参数7。一般来说,对于只带有少量参数的函数,仅使用寄存器就足够了;超过8个的参数会存放在堆栈中用于传递给子例程。
3,返回值
用于参数传递的寄存器同时也可用来保存函数的返回值,对于C语言这种函数返回类型基本都是一个整数(指针,变量)的,r0寄存器足够了
|