- arm32 armeabi-v7a
- arm64 armeabi-v8a
- x86
可执行程序是为了实现某个功能而由不同机器指令按特定规则进行组合排列的集合。无论高级还是低级程序语言,无论是面向对象还是面向过程的语言最终的代码都会转化为一条条机器指令的形式被执行。为了管理上的方便和对代码的复用,往往需要将某一段实现特定功能的指令集合进行抽离和处理从而形成了函数的概念,函数也可以称之为子程序或者子例程。出现函数的概念后可执行程序的机器指令集合将不再是单一的一块代码,而是由多个函数组成的分块代码,这样可执行程序就变成了由函数之间相互调用这种方式来构建和组织了。
如何去定义一个函数,如何去实现一个函数,如何去调用一个函数,如何将参数传递给被调用的函数,如何使用被调用者函数的返回这些都需要有统一的标准规范来进行界定,这个规则有两个层面的标准:在高级语言层面的规则称之为API规则;而在机器指令层面上则由于不同的操作系统以及不同的CPU体系结构下提供的指令集和构造程序的方式不同而不同,所以在系统层面的规则称之为ABI规则。
ARM中函数调用通过B系列指令(B\BL\BLX\BLR)等完成,之间的区别主要为操作数为寄存器还是立即数、是否支持切换THUMB状态、是否保存当前地址至LR寄存器。
ARM32位系统没有专门用于返回的ret指令,因为可以直接修改PC寄存器的值,因此函数返回时可以直接设置PC寄存器的值为函数的返回地址,也可以执行b/bx跳转指令并指定目标地址为LR寄存器中的值。
ARM64函数返回的指令是ret,等价于将LR寄存器中的值赋值给PC寄存器。
返回值则通过R0寄存器进行保存。
整个ARM32位体系下的参数传递和参数返回都不会用到浮点寄存器。对于大于4字节的基本类型则会拆分为两部分依次保存到连续的两个寄存器中。传递根据参数的个数从左到右依次保存到R0-R3四个寄存器中,超过的部分从右往左依次保存到栈内存中。ARM64中寄存器个数为8个。