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数据模型时候.
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数据模型时候.
相关文章推荐
- SecutrCRTt 连接VirtualBox 中的Ubuntu -端口转发
- AngularJS--双向数据绑定
- iOS UI 07 uitableviewi2
- Hibernate 连接oracle 数据库提示异常
- [Coursera]算法基础_Week5_动态规划(2)_Q1
- iOS UI 07 uitableview
- Linux下常用命令
- 通过NFS挂载实现从PC传程序到ARM开发板
- iOS UI 07 uitableview
- 设计模式——生成器模式
- iOS 网页进度条 NJKWebViewProgress
- eclipse 控制台乱码
- 04 Python正则表达式 爬虫程序 变量的引用,浅拷贝,深拷贝 多线程 进程锁 数据库模块
- Linux安全运维日志排查几个 tips
- 基于ASP.NET的Comet长连接技术解析
- iOS 简单实现alertview 定时移除
- 当html中存在url中如: onclick="toView('参数1')", 参数1是特别字符,如&asop;"' "等时,浏览器解析时会报错。解决方法如文中描述
- HTTP
- hdu1695(容斥 or 莫比乌斯反演)
- hdu 5596 GTW likes gt(逆向思维)