ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ARM : APCS规则

2020-01-15 20:39:20  阅读:571  来源: 互联网

标签:R0 R3 规则 子程序 参数 寄存器 堆栈 APCS ARM


ATPCS (ARM-Thumb Procedure Call Standard) 规定了一些子程序间调用的基本规则,这些规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则。有了这些规则之后,单独编译的C语言程序就可以和汇编程序相互调用。 

AAPCS (ARM Archtecture Procedure Call Standard) AAPCS是ATPCS的改进版。

APCS:ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明确的限制。它们可以编译自 C、 Pascal、也可以是用汇编语言写成的。

APCS 定义了:

  • 使用栈的惯例。

  • 对寄存器使用的限制。

  • 在函数调用之间传递/返回参数。

  • 可被"回溯"的基于栈的结构的格式。

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的当前值就会丢失。

 

寄存器使用规则
  • 子程序间通过寄存器R0~R3来传递参数。这时,寄存器R0~R3可记作a0~a3。被调用的子程序在返回前无需恢复寄存器R0~R3的内容。
  • 在子程序中,使用寄存器R4~R11来保存局部变量。这时,寄存器R4~R11可以记作v1~v8。如果在子程序中使用了寄存器v1~v8中的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。
  • 寄存器R12用作过程调用中间临时寄存器,记作IP。在子程序之间的连接代码段中常常有这种使用规则。
  • 寄存器R13用作堆栈指针,记作SP。在子程序中寄存器R13不能用作其他用途。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。
  • 寄存器R14称为连接寄存器,记作LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
  • 寄存器R15是程序计数器,记作PC。它不能用作其它用途。
  堆栈使用规则 ATPCS规定堆栈为FD(Full Descending: sp指向最后一个压入的值,数据栈由高地址向低地址生长)类型,即满递减堆栈,并且对堆栈的操作是8字节对齐。所以经常使用的指令就有STMFD和LDMFD。 对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件:
  • 外部接口的堆栈必须是8字节对齐的。
  • 在汇编程序中使用PRESERVE8伪指令告诉连接器,本汇编程序数据是8字节对齐的。
    参数传递规则 根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变化的子程序。 这两种子程序的参数传递规则是不一样的。  
  • 对于参数个数可变的子程序,当参数个数不超过4个时,可使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。在传递参数时,将所有参数看作是存放在连续的内存字单元的字数据。然后,依次将各字数据传递到寄存器R0,R1,R2和R3中。如果参数多于4个,则将剩余的字数据传递到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。
 
  • 如果系统不包含浮点运算的硬件部件,浮点参数会通过相应的规则转换成整数参数(若没有浮点参数,此步省略),然后依次将各字数据传送到寄存器R0~R3中。如果参数多于4个,将剩余的字数据传送堆栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。在参数传递时,将所有参数看作是存放在连续的内存字单元的字数据。
  子程序结果返回规则
  • 结果为一个32位整数时,可以通过寄存器R0返回;
  • 结果为一个64位整数时,可以通过寄存器R0和R1返回;
  • 结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或s0来返回;
  • 结果为复合型浮点数(如复数)时,可以通过寄存器f0~fn或d0~dn来返回;
  • 对于位数更多的结果,需要通过内存来传递。
woshidytgg 发布了55 篇原创文章 · 获赞 30 · 访问量 4万+ 私信 关注

标签:R0,R3,规则,子程序,参数,寄存器,堆栈,APCS,ARM
来源: https://blog.csdn.net/woshidytgg/article/details/103995326

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有