(参考文档:ARM官网 ==> Procedure Call Standard for the ARM Architecture,Procedure Call Standard for the ARM 64-bit Architecture)
什么是 AAPCS,有何用?
。ARM结构过程调用规范(ARM Architecture Procedure Call Standard).
。ABI (Application Binary Interface)
。描述汇编代码 = => C代码 函数参数、返回值传递方法.
。分析coredump,必然会接触ARM汇编,要了解汇编和C代码直接的参数传递方法,必然要熟悉 AAPCS.
[ARM32]
1、核心寄存器(Core register:r0 - r15)

r0 - r3 (a1 - a4)
> 子程序之间通过r0 - r3传递子程序前4个参数,剩余参数通过压栈传递,8个字节的double类型由两个寄存器一起传递
> 子程序的返回值也使用r0 - r3传递,若是组合类型,超过4字节的将结果存在内存中,然后返回内存地址.
r4 - r8,r10 & r11 (v1-v5, v7 & v8)
> 用于保存局部变量,另外,注意 thumb用r4 - r7,但不局限于r4 - r7.
r9
> 平台相关,如 在数据位置无关模型里面作为 static base ,作为TLS指针 thread register (TR)或者普通的 v6.
r12
> 用于子程序间(子程序如果太远需要胶合代码辅助跳转) scratch 寄存器? 别名是 ip
r13 - r15
> 特殊用途寄存器,SP, LR, PC
> 在调用子程序前后,保证r4-r8, r10, r11和SP(如果r9作为v6,则包括r9)的值不变如果在子程序内有使用以上寄存器,那么必须在子程序头做压栈保存寄存器值,在退出之程序前做出栈回复寄存器值
2、堆栈 & 子程序调用
> ARM堆栈为FD (满递减) 类型,对堆栈的操作是8字节对齐的。使用stmdb/ldmia批量内存访问指令来操作FD堆栈
> LDRD/STRD要求数据栈是8字节对齐的,以提高数据的传送速度
比如:STMFD sp!,{R4-R11,LR,PC}, PC是不需要压栈保存的,这里压栈仅仅是为了保证8字节边界对齐
> 子程序调用需要完成以下动作
LR[31:1]保存返回地址,LR[0]保存返回状态: 0: ARM, 1: thumb, PC指向子程序头地址
> LDRD/STRD要求数据栈是8字节对齐的,以提高数据的传送速度
比如:STMFD sp!,{R4-R11,LR,PC}, PC是不需要压栈保存的,这里压栈仅仅是为了保证8字节边界对齐
> 子程序调用需要完成以下动作
LR[31:1]保存返回地址,LR[0]保存返回状态: 0: ARM, 1: thumb, PC指向子程序头地址
[ARM64]
1、核心寄存器(r0 - r30)

r0 - r7
> 用于子程序之间参数传递和结果返回寄存器.
r8
> 平台特殊寄存器,用于 carry inter-procedural state ,也可用于额外的局部变量寄存器.
r9 - r15
> 用于保存局部变量寄存器.
r16 & r17 (IP0 & IP1)
> 用于子程序之间的scratch 寄存器中间值,类似ARM32中的r12寄存器功能.
r19 - r29
> 所有保存在r19-r29 中的64位值都必须是被保存不变的,即使当使用ILP32数据模型时候.