基本的ATPCS规则

基本ATPCS规定了在子程序调用时的一些基本规则,包括下面四方面的内容。

各寄存器的使用规则及其相应的名称。

数据栈的使用规则。

参数传递的规则。

子程序结果的返回规则。


1. 寄存器的使用规则及其相应的名称

寄存器的使用必须满足下面的规则。

子程序间通过寄存器R0~R3来传递参数,被调用的子程序在返回前无需恢复寄存器R0~R3的内容。

在子程序中,使用寄存器R4~R11保存局部变量,这时寄存器可以记作V1~V8。如果在子程序中用到了寄存器V1~V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。

寄存器R12用作子程序间的Scratch寄存器(用于保存SP, 在函数返回时使用该寄存器出栈),记作IP。

寄存器R13用作数据栈指针,记作SP。在子程序中寄存器R13不能用作其他用途。寄存器SP在进入子程序时的值和退出子程序的值必须相等。

寄存器R14称为连接寄存器,记作LR。它用作保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。

寄存器R15是程序计数器,记作PC。它不能用作其他用途。

ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的。

表4-1总结了在ATPCS中各寄存器的使用规则及其名称。

表4-1  寄存器的使用规则

寄存 器

别 名

特殊名称

使 用 规 则

R15

 

PC

程序计数器

R14

 

LR

连接寄存器

R13

 

SP

数据栈指针

R12

 

IP

子程序内部调用的Scratch寄存器

R11

V8

 

ARM状态局部变量寄存器8

R10

V7

Sl

ARM状态局部变量寄存器7

在支持数据检查的ATPCS

中为数据栈限制指针

 

 

 

 

 

 

 

 

 

 

 



(续表)

寄 存器

别名

特殊名称

使 用 规 则

R9

V6

SB

ARM状态局部变量寄存器6

在支持RWPI的ATPCS

中为静态基址寄存器

R8

V5

 

ARM状态局部变量寄存器5

R7

V4

WR

ARM状态局部变量寄存器4

Thumb状态工作寄存器

R6

V3

 

局部变量寄存器3

R5

V2

 

局部变量寄存器2

R4

V1

 

局部变量寄存器1

R3

A4

 

参数/结果/Scratch寄存器4

R2

A3

 

参数/结果/Scratch寄存器3

R1

A2

 

参数/结果/Scratch寄存器2

R0

A1

 

参数/结果/Scratch寄存器1


 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 


2. 数据栈的使用规则

栈指针是保存了栈顶地址的寄存器值。栈指针通常可以指向不同的位置。一般的,栈可以有以下四种数据栈。

FD:Full Descending

ED:Empty Descending

FA:Full Ascending

EA:Empty Ascending

当栈指针指向与栈顶元素时,称为Full栈。当栈指针指向与栈顶元素相邻的一个元素时,称为Empty栈。数据栈的增长方向也可以不同,当数据栈向内存减少的地址方向增长时,称为Descending栈;反之称为Ascending栈。ARM的ATPCS规定默认的数据栈为Full Descending(FD)类型,并且对数据栈的操作是8字节对齐的。

3. 参数传递的规则

根据参数个数是否固定可以将子程序参数传递规则分为以下两种。

(1) 参数个数可变的子程序参数传递规则

对于参数个数可变的子程序,但参数不超过四个时,可以使用寄存器R0~R3来传递参数;当参数超过四个时,还可以使用数据栈来传递参数。在传递参数时,将所有参数看作是存放在连续的内存单元中的字数据。然后,依次将各字数据传送到寄存器R0、R1、R2、R3中,如果参数多于四个,则将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。

(2) 参数个数固定的子程序参数传递规则

对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递的规则不同,如果系统包含浮点运算的硬件部件,浮点参数将按各个浮点参数按顺序处理和为每个浮点参数分配FP寄存器的规则传递。分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器中,第一个整数参数,通过寄存器R0~R3来传递,其他参数通过数据栈传递。

4. 子程序结果返回规则

子程序中结果返回的规则如下。

如果结果为一个32位的整数,可以通过寄存器返回。

如果结果为一个64位整数,可以通过寄存器R0和R1返回,依此类推。

如果结果为一个浮点数,可以通过浮点运算的寄存器F0、D0或S0返回。

如果结果为复合型的浮点数(如复数),可以通过寄存器F0~FN或者D0~DN返回。

对于为数更多的结果,需要通过内存来传递。


转载 gyh198 的博文:http://blog.csdn.net/gyh198/article/details/7247505

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值