ARM架构过程调用标准AAPCS

本文详细解释了ARM架构处理器AAPCS规范中参数和返回值的传递方式,涉及寄存器使用、函数调用中的保存规则,以及链接寄存器LR的作用,以STM32F407为例,通过实例展示如何处理函数调用中的参数和调用链路管理。
摘要由CSDN通过智能技术生成

AAPCS是ARM架构的处理器规定的一些标准

1、参数和返回值传递,对于简单的情况,输入参数由R0-R3分别用来记录第1到第4个参数。当传递的参数超过4个时,就需要借助栈来保存参数。函数的返回值通常保存在R0中,若返回值为64位的,R1也用来保存返回值。

2、函数调用中的寄存器用法。函数或子程序应该保持R4-R11、R13和R14的数值。若这些寄存器在函数或子程序执行期间被修改,则其函数应该保持在栈中并在返回调用代码前恢复。这几个寄存器也被称作“被调用者保存寄存器”,也就是需要被调用者(例如子函数,中断等)进行保存的寄存器。而对于R0-R3、R12、则属于调用者保存寄存器,这几个寄存器是需要调用者做保存工作。在发生异常或中断啊时,R0-R3、R12、SP、PC会硬件自动进程压栈。

3、链接寄存器LR用于函数或子程序调用时返回地址的保存,若某函数需要调用另外一个函数或子程序,则它需要首先将LR的数值保存到栈中,否则,当执行了函数调用后,LR的当前值就会丢失。

看几个简单的例子,以STM32F407为例子

一个简单的例子,一个有两个参数的求和函数。在传参数1和2的时候,R0,R1作为了传参时的寄存器。 

 

返回值通过R0传递。再看看LR如何使用的呢,m=sum(1,2);的下一条语句的地址是0x8000536,进入sum子函数后,这个地址被保存到了LR中(第二张图),LR的实际保存的是0x8000537,这是因为LR最低位置1表示是thumb状态。 

 

 

函数中再次调用子函数,如何处理呢,我们为了体现效果,在sum函数再加一个函数,这个函数本身没什么作用 

 

与没有添加wuyong函数相比,进入sum的时候多了一条PUSH {r4-r5,lr},这是因为:

1、r0,r1在接下来wuyong函数中需要拿来传递两个参数,所以用r3,r4来保存了原先R0和R1的值,R5保存了局部变量e的值。所以先将r4,r5保存到了栈中

2、由于sum又调用了子函数,所以需要先将lr保存到栈中,调用wuyong时,lr需要保存执行完wuyong函数后的返回地址。

执行完这一句后,r4,r5,lr被推入了栈中。

 上述几个过程,把AAPCS的一些要点大概过了一下,细节的东西有兴趣可以继续研究研究

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值