1.1 R0~R12
R0~R12为通用目的寄存器,其中:R0-R7为低组寄存器,字长32位,由于指令中可用的空间有限,绝大多数16位指令只能访问低组寄存器;R8-R12为高组寄存器,字长32位,只有很少的16位Thumb指令可以访问它们。
注意:32位Thumb-2指令可用访问所有通用寄存器,R0~R12复位后的初始值未知。
1.2 堆栈指针R13(SP, Stack Pointer)
CM3/4处理器内核中有两个堆栈指针:
主堆栈指针MSP(SP_main):缺省的堆栈指针,它由OS内核、异常服务例程以及所有需要特权访问的应用程序代码来使用,MSP的初始值在复位时从SRAM中的第一个字中取出(向下生长的满栈)。
进程栈指针PSP(SP_process):用于常规的应用程序代码(不处于异常服用例程中时),PSP初始值未定义。
裸机一般只用MSP,用到OS时才会使用PSP。
当引用R13时,引用到的是当前正在使用的那一个,另一个必须用MRS/MSR指令来访问。
堆栈指针的选择由特殊寄存器CONTROL(后面会说到)决定。
堆栈指针访问堆栈时的操作:
堆栈由一块连续的内存和一个栈顶指针组成,用于实现LIFO的缓冲区。典型应用:在数据处理前先保存寄存器的值,任务处理完后再从堆栈中恢复先前保护的值。
OS中上下文切换时的保护现场与恢复现场,就是用堆栈来保存和恢复数据的。
4