函数调用
函数调用
一. 调用规范
ARM函数调用约定采用的是:ATPCS
ATPCS的英文全称是ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)
总结:参数1~参数4 分别保存到 R0~R3 寄存器中,剩下的参数从右往左一次入栈,被调用者实现栈平衡,返回值存放在 R0 中。
r0–r3:存储传递给函数的参数值,多余的参数通过压栈传递。
r4 -r11:存储函数的局部变量,Thumb模式不会使用r8以后的寄存器
r12:是内部过程调用暂时寄存器(intra-procedure-call scratch register)。
r13:存储栈指针(sp)。在计算机中,栈非常重要。这个寄存器保存着栈顶的指针。这里可以看到更多关于栈的信息。
r14:链接寄存器(link register)。存储着当被调用函数返回时,将要执行的下一条指令的地址。
r15:用作程序计数器(program counter)。存储着当前执行指令的地址。每条执行被执行后,该计数器会进行自增(+1)。
函数的返回值放到r0中。
fp叫做frame pointer寄存器,即栈帧指针寄存器;sp叫做stack pointer寄存器,即栈指针寄存器。
在ARM指令系统中是地址递减栈,入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的你操作。包括push/pop和LDMFD/STMFD等。
二. 堆栈使用规则
ATPCS规定堆栈为FD类型,即满递减堆栈(与X86相同)。并且堆栈的操作是8字节对齐。
而对于ARM汇编来说,如果目标文件中包含了外部调用,必须满足以下条件:
1.外部接口的数据栈一定是8位对齐的,也就是要保证在进入该汇编代码后,直到该汇编程序调用外部代码之间,数据栈的栈指针变化为偶数个字;
2.在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序是8字节对齐的.。