函数调用

函数调用

一. 调用规范

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字节对齐的.。

image

image

三. 参考文章:

  1. 安卓逆向:这是一篇逆向基础函数在ARM32中的刨根问底。-腾讯云开发者社区-腾讯云 (tencent.com)
posted @ 2024-03-22 09:07  ONE_ZJ  阅读(11)  评论(0编辑  收藏  举报