32位
arm在任何模式(9种)下 都有的以下寄存器
- 15个通用寄存器,包括R0-R12, SP(the Stack SP), LR(Link Register)
- 1 个PC(Program Counter)
- 1 一个APSR(Application Progrem Status Register)、
- 其中R0~R3 用于函数调用入参,32位最多支持4个入参,当多于4个入参是将通过压栈方式进行传递。栈的方式为先进后出,估参数大于4个时 入栈顺序与参数顺序正好相反,子程序返回前无需回复R0~R3的值
- R4~R11用于保存局部变量。函数进入后首先第一件事就是将R4~R11入栈保存(看局部变量用了多少个,不一定所有都需要入栈),然后才能用于本函数使用,本函数使用完之后,要将之前栈保存的数据恢复到R4~R11中。
- R13为SP,时刻指向栈顶,当有数据入栈或出栈时,需要更新SP
- R14为链接寄存器,主要是用作保存子程序返回的地址
- R15为PC寄存器,指向将要执行的下一条指令地址
- 程序返回值如果是32位 则用R0进行返回,为64位时则R0返回低位, R1返回高位
寄存器在各个模式下的分布:
由上图可知:
- 除了systerm和Hyp模式下,其他模式都有各自的 SP和LD寄存器
- FIQ模式下,将会有R8_fiq,R9_fiq,R10_fiq,R11_fiq,R12_fiq,SP_fiq,LR_fiq等7个寄存器
- Hyp模式下,有一个SP_hyp寄存器
- 7 个SPSR寄存器
- 1个 ELR_hyp寄存器(Hyp模式下)
综上所述,实际上共有43个寄存器。
64位
64位模式下,arm有32个寄存器
- X0~X7:用于函数入参,最多支持8个函数入参,多余采用入栈方式
- X0:用于返回函数结果,为64位,如果要返回128位X0为低位, X1为高位
- X8 :主要用于子程序地址
- X9~X15:用作临时变量寄存器,用于保存局部变量
- X16~X17:为子程序内部调用寄存器
- X18:平台寄存器,尽量少用
- X19~X28:临时寄存器,使用时需要保存
- X29:为PC指针寄存器
- X30:为链接寄存器
- X31为SP寄存器或者