|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
根据参数个数是否固定可将之程序分为参数个数固定的子程序和参数个数可变的子程序。这2种子程序的参数传递规则是不同的。
# L0 ?5 m1 g& X. F6 @1)+ O2 q2 c0 U; P9 x8 L
参数个数固定的子陈旭参数传递规则
& l% F. @- U% }/ p9 v/ g对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同。如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递:
`% p( s" O/ E各个浮点参数按顺序处理。
" e6 Z8 c$ x% w为每个浮点参数分配FP寄存器。分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器。
# A T7 \% R# X- [" y8 U" P第一个整数参数,通过寄存器R0~R3来传递,其他参数通过数据栈传递。+ O- R. n6 x2 g" q7 v
2)
$ I% e/ Y* C% O1 v O参数个数可变的子程序参数传递规则
# b% M& p, ?& j0 e; l8 K9 n对于参数个数可变的子程序,当参数不超过4小时,可使用寄存器R0~R3来书安迪参数;当参数超过4小时,还可使用数据栈来传递参数。
* t6 v1 o7 K$ |, [3 \在参数传递时,将所有参数看作是存放在连续的内存单元中的字数据。然后,一次将各字数据传送到寄存器R0,R1,R2,R3中,如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。4 J4 T K' w) [$ f
按照以上传递规则,对于一个浮点数参数可通过寄存器传递,也可通过数据栈传递,也可能一般通过寄存器传递,一般通过数据栈传递。: B0 E7 V" z% e. T4 e& W2 U
3)
) _! Y- F x5 c% o0 M7 @子程序结果返回规则- N+ o* ?; |2 P" F
结果为一个32位的整数时,可通过寄存器R0返回。& n" J1 H: S5 r( j
结果为一个64位整数时,可通过寄存器R0和R1返回,依次类推;% \; N1 W' q, y2 d% K
结果为一个浮点数,可通过浮点运算部件的寄存器F0、D0或者S0来返回;! `& t6 i0 b3 b* D- H7 A3 t
结果为复合型的浮点数时,可通过寄存器F0~Fn或者D0~Dn来返回;
, A: N# \& T6 R9 Z对于位数更多的结果,需要通过内存来传递。# Y" D( R( p) \; h
ARM程序和Thumb程序混合使用的ATPCS
! g. v+ S' K3 k# Z# O# p为了适应一些特殊需求,对ATPCS规定的子程序间调用的基本规则进行修改,得到了几种不同的子程序调用规则,包括:
1 [+ |2 H$ o% B1 C" p支持数据栈限制检查的ATPCS
3 p/ `$ M" S T支持只读段位置无关的ATPCS1 V' g" O, H- l9 K) w
支持可读/写段位置无关的ATPCS, N. A0 w5 T" Y) y; U2 |8 c3 w
支持ARM程序和Thumb程序混合使用的ATPCS
5 S5 S% ^0 G0 Y) \0 _% e B支持处理器浮点运算的ATPCS1 W! Y8 V+ Z" F$ W/ D
在这里只是简单介绍支持ARM程序和Thumb程序混合实用化的ATPCS
0 y6 c$ h1 Q) S。在编译和汇编时,通过使用/interwork告诉编译器生成的目标代码遵守支持ARM程序和Thumb程序混合使用的ATPCS。它一般用于以下场合:& B3 D$ W) p8 k, c# f5 r* f4 R
程序中存在ARM程序调用Thumb程序的情况。: E- T/ Z+ }" M; a1 f" @2 k0 H
程序中存在Thumb程序调用ARM程序的情况。
7 n3 u* u8 r2 c/ R1 T需要链接器来进行ARM状态和Thumb状态切换的情况。
' e& n* I4 y! k0 S: V- J9 Z7 R在下述情况下,使用选项/nointerwork:3 |; `* B7 ]. |% ?4 Y
程序中不包含Thumb程序;
( G9 m5 k' Y2 o5 @# R) H2 n) L, t% K用户自己进行ARM状态和Thumb状态切换。' J4 _6 j7 P4 R% Q- W+ b0 l
其中,选项/nointerwork是默认的选项。
( L8 R7 O1 X4 t2 L' \2 ~4 l注意:在同一个C源程序中不能同时包含ARM指令个Thumb指令,但汇编可以。
3 L6 V8 m7 g; w2 r" L4 a c0 L8 S如果程序遵守支持ARM程序和Thumb程序混合使用的ATPCS,则程序中ARM子程序和Thumb子程序可相互调用。对于C源程序,只要在编译时指定apcs/interwork选项,编译器生成地代码会自动遵守支持ARM程序和Thumb程序混合使用的ATPCS。而对于汇编源程序,必须保证编写的代码遵守支持ARM程序和Thumb程序混合使用的ATPCS。
& n" O2 }* I+ b" m- @当链接器发现有ARM子程序与Thumb子程序相互调用时,链接器将修改相应的调用和返回代码,或者添加一段veneers代码(通过将链接器生成的用于程序状态切换的代码段称为veneers代码)来完成程序状态的切换。 |
|