您的位置:首页 > 其它

AAPCS - 学习笔记

2015-12-13 16:03 246 查看
(参考文档: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指向子程序头地址

[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数据模型时候.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: