AAPCS是ARM架构的处理器规定的一些标准。
- 参数和返回值传递,对于简单的情况,输入参数由R0-R3分别用来记录第1到4个参数。当传递的参数超过4个时,就需要借助栈来保存参数。函数的返回值通常保存在R0中,若返回值为64位,R1也用来保存返回值。
- 函数调用中的寄存器用法。函数或子程序应该保持R4-R11、R13和R14的数值。若这些寄存器在函数或子程序执行期间被修改,则其函数应该保持在栈中并在返回调用代码前恢复。这几个寄存器也称作“被调用者保存寄存器”,也就是需要被调用者(例如子函数,中断等)进行保存的寄存器。而对于R0-R3、R12、则属于调用者保存寄存器,这几个寄存器是需要调用者做保存工作。在发生异常或中断啊时,R0-R3、R12、SP、PC会硬件自动进程压栈。
- 链接寄存器LR用于函数或子程序调用时返回地址的保存,若某函数需要调用另外一个函数或子程序,则首先将LR的数值保存到栈中,否则,当执行了函数调用后,LR的当前值就会丢失。
返回值通过R0传递。再看看LR如何使用的呢,m=sum(1,2);的下一条语句的地址是0x8000536,进入sum子函数后,这个地址被保存到了LR中(第二张图),LR的实际保存的是0x8000537,这是因为LR最低位置1表示是thumb状态。