ADS编译链接环境定义了统一的函数过程调用标准ATPCS(ARM-Thumb Procedure Call Standard)。
1、概述:
ATPCS定义{R0–R3}为参数传递和结果返回寄存器; 若参数超过4个字型(32bit),则使用堆栈进行传递; ———内部寄存器的存取速度要远远大于存储器,一般应尽量使参数传递通过寄存器事项,即应尽量控制函数的参数在4个字型以下,使得函数调用尽量快、小、易于优化。 ———深入理解ATPCS有助于透彻理解C与汇编混合调用时参出传递;
2、ATPCS中定义的寄存器:
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规定子程序调用前后内核寄存器状态:
———因此,利用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中的陈述:
5、返回值:
一个子程序调用可能没有返回值(void型),也可能有1-4个字型(32bits)值返回(这里仅讨论返回值小于等于四的情况),这些返回值也装载在r0-r3中: