ARM基础学习-ATPCS子程序调用基本规范

ATPCS是: Arm Thumb procedure Call Standard的缩写。意思是arm程序和thumb程序中子程序调用的基本规范。

寄存器的使用规则

当参数个数小于等于4个的时候,子程序间通过R0~R3来传递参数,在返回前无需恢复寄存器R0~R3的内容;如果参数个数大于4个,余下的参数就通过sp所指向的数据栈进行参数传递。在栈上开辟8字节的空间进行参数传递。

在子程序中,使用R4~R11来保存局部变量,如果子程序要使用这些寄存器,进入子程序时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;

寄存器R12用作scratch寄存器,记为ip;在程序调用过程中间临时寄存器IP;

寄存器R13用做堆栈指针SP。在子程序中寄存器R13不能用做其它用途。寄存器SP在进入子程序时的值和退出子程序的值必须相等。

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

寄存器R15为程序计数器PC,不能用做其他用途。

子程序结果返回规则

函数调用完毕后,如果函数有返回值,函数一般把返回值保存在r0寄存器中,因此一般我们通过bl指令调用一个函数后,就可以通过在汇编里面访问r0得到返回值。

子程序结果返回规则:

   1.结果为一个32位的整数时,可以通过寄存器R0返回.
   2.结果为一个64位整数时,可以通过R0和R1返回,依此类推.
   3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回.
   4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回.
   5.对于位数更多的结果,需要通过调用内存来传递.

数据栈使用规则

栈指针可以指向不同的位置,ARM有4种数据栈,分别是:

递增空栈,
递增满栈,
递减空栈, 
递减满栈,

ATPCS规定数据栈为递减满栈(FD),并对数据栈的操作是8字节对齐的;下面是数据栈相关的名词解释;

  1.数据栈栈指针.stack pointer 指向最后一个写入栈的数据的内存地址.
  2.数据栈的基地址.stack base 是指数据栈的最高地址.由于ATPCS中的数据栈是FD类型的,实际上数据栈中最早入栈数据占据的内存单元是基地址的下一个内存单元.
 3.数据栈界限.stack limit 是指数据栈中可以使用的最低的内存单元地址.
 4.已占用的数据栈.used stack 是指数据栈的基地址和数据栈栈指针之间的区域.其中包括数据栈栈指针对应的内存单元.
 5.数据栈中的数据帧(stack frames) 是指在数据栈中,为子程序分配的用来保存寄存器和局部变量的区域.
  
   异常中断的处理程序可以使用被中断程序的数据栈,这时用户要保证中断的程序数据栈足够大.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章