ARM32 一共有 16 个通用寄存器:R0~R15。它们是 CPU 用来存数据、地址、临时变量。
1. R0~R3
- 函数调用时传参用
- 函数返回值放在 R0
- 临时计算、临时数据
- 调用子函数时,这些寄存器不保证被保存(调用者负责保存)
2. R4~R11
- 真正的局部变量寄存器
- 调用子函数时必须被保存和恢复(被调用者负责)
- 适合放循环变量、长期使用的变量
3. R12(IP / Intra-Procedure Call Scratch Register)
- 不用管,因为mcu的使用场景,R12特殊功能并未启用,当通用寄存器使用。
4. R13(SP,Stack Pointer)
- 栈指针
- 永远指向当前栈顶
- 压栈、出栈、函数栈帧都靠它
- 不能随便乱改
5. R14(LR,Link Register)
- 链接寄存器
- 执行
BL(带链接跳转)时,返回地址自动存入 LR - 函数返回靠
BX LR或MOV PC,LR - 嵌套调用时必须把 LR 压栈
6. R15(PC,Program Counter)
- 程序计数器
- 存下一条要执行的指令地址
- ARM 经典特性:读取 PC 时值 = 当前指令地址 + 8
- 直接写 PC 就实现跳转