Cortex-M内存架构包含16个通用寄存器,其中R0-R12是13个32位的通用寄存器,另外三个寄存器是特殊用途,分别是R13(栈指针),R14(链接寄存器),R15(程序计数器)。
对于处理器来说,寄存器可以作为暂存器,存储临时结果,也可以作为输入数据,方便运算,也可以作为索引,去访问寄存器,其作用各种各样。
其中R0-R7是低寄存器,因为16位的指令只能访问他们,而R8-R12是高寄存器,可以被16或32位指令访问,需要注意的的是,这些通用寄存器在复位后初始值是未定义的,所以在初始前,必须由程序显式初始化,也可以编写汇编代码嵌入代码段。
R13寄存器—— SP栈指针
它是ARM处理器中最重要的专用寄存器之一,负责管理函数调用和局部变量的内存分配。
我们通常通过PUSH和POP指令访问栈空间,实现局部变量保存,函数返回地址等信息的管理,从物理机构看,ARM-Cortex-M系列寄存器实际上拥有两个栈指针,主栈指针 MSP (Main Stack Pointer)和进程指针 PSP(Process Stack Pointer)
MSP (Main Stack Pointer,主栈指针)
用于操作系统内核和异常处理
所有异常模式默认使用MSP
PSP (Process Stack Pointer,进程栈指针)
用于用户应用程序
在用户线程模式下使用
R14—— LR链接寄存器
它用于保存函数或者子程序调用返回的地址
在函数或子程序被调用时,调用指令下一条指令的地址被保存到LR寄存器中,这样,当函数或子程序结束时,处理器可以通过LR寄存器中的值返回到正确的地址继续执行。
如果函数中调用了函数呢?A函数调用了B函数,B函数还调用了C函数,这时候LR的值会被覆盖,从而无法再恢复到A函数中继续运行,所以需要将LR的数值保存到栈中,包括异常处理也是由LR寄存器负责异常处理时的地址返回
为什么不能依赖 LR 本身?
LR 只有一个,但函数调用可以 无限嵌套,必须用栈存储 调用链。
异常/中断可能在任何时候发生,必须保证 LR 不被意外覆盖。
递归函数 必须保存 LR,否则无法正确返回。
R15——PC程序计数器
该寄存器的值永远是下一个执行指令的地址,在ARM架构中,CPU的执行指令包括 取指(Fetch)、译码(Decode)和执行(Execute)三个阶段,PC在其中承担关键作用,它决定了从哪里取指,控制程序的顺序流转,异常处理和函数跳转都和PC指针息息相关,