ATPCS

看bootloader的nand flash部分汇编调用C函数部分,看到参数传递使用的是R0,R1,R2,几个寄存器,碰到了新名词,了解下,在 这里
其实自己目前只要知道这个标准规定了:参数传递以及返回值使用R0-R3寄存器就够了。更详细的有本pdf在 这里(可右键另存为来下载)

ADS编译链接环境定义了统一的函数过程调用标准ATPCS(ARM-Thumb Procedure Call Standard)。

1、概述:

    ATPCS定义{R0–R3}为参数传递和结果返回寄存器;
    若参数超过4个字型(32bit),则使用堆栈进行传递;
    ———内部寄存器的存取速度要远远大于存储器,一般应尽量使参数传递通过寄存器事项,即应尽量控制函数的参数在4个字型以下,使得函数调用尽量快、小、易于优化。
    ———深入理解ATPCS有助于透彻理解C与汇编混合调用时参出传递;
 
2、ATPCS中定义的寄存器:
ATPCS - PiNo - PINO's blow G
    The first four registers r0-r3 are used to pass parameter values into a routine and result values out of a routine, and to hold intermediate values within a routine (but, in general, only between subroutine calls). In ARM-state, register r12—also called IP—can also be used to hold intermediate values between subroutine calls.

    Typically, the registers from r4 to r11 are used to hold the values of a routine’s local variables. They are also labeled v1-v8.

    In all variants of the procedure call standard, registers r12-r15 have special roles. In these roles they are labeled IP, SP, LR and PC (or ip, sp, lr, and pc).

3、子程序调用:

    子程序调用通过可实现如下功能的指令实现:
    LR <-- return address
    PC <-- destination address
    ...
    return address:
    ...
    这在ARM一般可通过一条BL指令达到。ATPCS规定子程序调用前后内核寄存器状态:
ATPCS - PiNo - PINO's blow G
    ———因此,利用ADS编译环境(遵循ATPCS标准)编译后的子程序汇编代码一般不会对r4~r11操作,这也是如下两条语句普见于汇编代码中的原因(子程序中仅对r0~r3、r12等进行操作,故也只对这些个寄存器入栈出栈保护):
      STMFD   SP!, {R0-R3, R12, LR}
      …… ……
      LDMFD   SP!, {R0-R3, R12, PC}^
      
4、参数传递:
    头4个参数依次存于R0...R3,大于4个的后续字型参数通过栈传送,见ATPCS中的陈述:
ATPCS - PiNo - PINO's blow G
 
5、返回值:
     一个子程序调用可能没有返回值(void型),也可能有1-4个字型(32bits)值返回(这里仅讨论返回值小于等于四的情况),这些返回值也装载在r0-r3中:
ATPCS - PiNo - PINO's blow G
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值