aapcs

概要
    使用工具分析coredump,不可避免要接触ARM汇编。汇编里的指令的含义可以查看spec了解,而函数参数的传递方法,栈的布局,寄存器的规划是查看汇编的重要部分,这部分由ARM AAPCS定义。熟悉它才能理解和分析coredump。

1. Procedure Call Standard for the ARM Architecture
    The layout of data
    Layout of the stack and calling between functions with public interfaces
    Variations available for processor extensions, or when the execution environment restricts the addressing model
    The C and C++ language bindings for plain data types
    熟悉AAPCS后,查看汇编代码将有很大帮助。

2. 文档来源
    ARM官网
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/index.html
    ARM软件开发工具 => ABI for the ARM Architecture => Procedure Call Standard for the ARM Architecture

3. Core registers
    
R0-R3(a1-a4)
        子程序间通过r0-r3来传递子程序前4个参数(剩余参数通过压栈传递,8个字节的double类型由两个寄存器一起传递)
        子程序返回结果,也是使用r0-r3来传递,如果组合类型(编译时不确定长度的)超过4字节的将结果存放在memory,然后返回地址
 
   R4-R8, R10 and R11 (v1-v5, v7 and v8)
        用于保存局部变量(thumb用R4-R7但不局限于R4-R7)
    R9
        平台相关,比如:
            在数据位置无关模型里作为:static base(SB)
            作为TLS指针:thread register(TR)
            或是作为普通的v6
    R12
        r12用作子程序间(子程序如果太远需要胶合代码辅助跳转)scratch寄存器,别名为ip
        也可以用来保存中间值
   
 R13-R15
        特殊用途,分别为SP(栈指针),LR(保存子程序的返回地址),PC(程序计数器)
        LR保存后,可以客串下保存中间值
    在调用子程序前后,保证R4-R8, R10, R11和SP(如果R9作为v6,则包括R9)的值不变
        如果在子程序内有使用以上寄存器,那么必须在子程序头做压栈保存寄存器值,在退出之程序前做出栈回复寄存器值。

4. 堆栈/子程序调用
    堆栈为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指向子程序头地址
        可以直接用BL指令也可以用多条指令合成
            ARM状态下:MOV LR, PC; BX R4;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值