寄存器是处理器内部用来存放二进制数据的一些小型存储区域,用来暂时存放参与运算的数据和运算的结果,是一种时序逻辑电路。寄存器是由具有存储功能的触发器组合构成的。一个触发器可以存储 1 位二进制代码,故存放 n 位二进制代码的寄存器,需用 n 个触发器来构成。在处理器中,给有特定功能的内存单元取一个别名,这个别名就是人们常说的寄存器,给已经分配好地址的有特定功能的内存单元取别名的过程称为寄存器映射。
Cortex-M4 在可编程模式下的寄存器包括通用寄存器(R0-R12)、堆栈寄存器(R13)、程序计数器(R15)、连接寄存器(R14)。图2.4 所示为Cortex-M4 的寄存器组。
图2.4 Cortex-M4 寄存器组
通用寄存器都是32 位的寄存器,用于数据操作,大多数16 位的Thumb指令只能访问R0~R7;32 位的Thumb2 指令可以访问所有的寄存器,其中R0~R7 为低寄存器,为 32 位寄存器,所有指令都可以访问,R8~R12 为高寄存器组,只有很少的Thumb指令可以访问它们,通用寄存器复位后的初始值不变。
在Cortex-M4 处理器中,堆栈寄存器可以写成SP或R13,Cortex-M4 包括两个堆栈指针,分别是MSP和PSP,两个堆栈指针在同一时间只有一个可见,若要使用另一个,则需要指令MRS和MRS对控制寄存器(CONTROL)第 0 位和第 1 位进行配置。堆栈指针的最低两位总是 0,这意味着它们总是字对齐。
①MSP为主堆栈指针,也可以写成SP_main,系统复位后默认为MSP指针,主要用于嵌入式操作系统内核和异常服务程序。
②PSP为进程堆栈指针,也可以写成SP_main,可以应用于嵌入式操作系统用户进程中。
在Cortex-M4 内核的处理器中,通常使用POP和PUSH完成进栈和出栈,这个与 51 系列单片机类似,值得注意的是,在每次使用POP和PUSH之后,SP的指针增加一个 32 位存储单元。
在嵌入式系统中,堆栈主要用来保存临时数据、局部变量和中断/调用子程序的返回地址。程序中栈主要是用来存储函数中的局部变量以及保存寄存器参数。具体包括:
①保存现场。
②传递参数,汇编代码调用C函数时,需传递参数。
③保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
连接寄存器R14 也可以写成LR,LR连接寄存器主要用于子程序调用时返回地址。例如,在汇编语句的子程序结束时,我们可以使用BX LR汇编语句返回主程序地址。
R15 是程序计数器,也可以表示为PC,程序计数器寄存器PC用来存储指向下一条指令的地址,即将要执行的指令代码,由于指令的流水线,读PC寄存器时返回值是当前指令的地址再增加 4 个字节的地址。
例如:
当向PC寄存器写入数据时,会引起程序的分支跳转(不更新LR寄存器),其中指令至少是半字节对齐的,所以PC的最低有效位总是读回 0。然而在分支时,无论是直接写PC的值还是使用分支指令,都必须保证加载到PC的数值是奇数(即最低有效位是 4 位),从而表明这是在Thumb状态下执行的。若写入0,则转入ARM模式,Cortex-M4 将产生一个Fault异常,因为Thumb2 本身包含了 16 位的Thumb指令和 32 位的ARM指令。
特殊寄存器主要包括程序状态寄存器、中断屏蔽寄存器、控制寄存器。
程序状态寄存器(xPSR)是运算器的一部分,主要用来存放当前指令执行的各种状态信息,如有无进位(C位)、有无溢出(O位)、结果正负(S位)、结果是否为零(Z位)、奇偶标志位(P位)等。程序状态寄存器(xPSR)的定义如图2.5 所示。
图2.5 xPSR寄存器定义(X=A. I. E)
程序状态寄存器又可以分为 3 个状态寄存器,分别是应用状态寄存器(APSR)、中断状态寄存器(IPSR)和执行状态寄存器(EPSR),这 3 个寄存器可以单独访问,也可以两个或者 3 个组合访问。在特权模式下,也可以通过MSR和MRS指令访问。
例如:
①IPSR寄存器是只读寄存器,主要用于存放当前正在执行的中断服务程序对应的异常编号,当没有异常时,IPSR的值为 0。
②EPSR寄存器T位必须为 1,表示始终执行Thumb指令,EPSR仅仅在调试状态下使用,处理器正常运行时,其值始终为 0。
③APSR用来存放应用程序运行的状态,各个状态位的功能描述见表2.4。
表2.4 APSR的各个状态位的功能描述
中断屏蔽寄存器主要用于控制中断的使能和禁止,包括PRIMASK,FAULTMASK和BASEPRI,这些寄存器的访问使用MSR和MRS指令。中断屏蔽寄存器组如图2.6 所示。
图2.6 中断屏蔽寄存器组
图2.6 中对应位的功能描述见表2.5。
表2.5 中断屏蔽寄存器组对应位的功能描述
控制寄存器(CONTROL)主要用来控制内核的运行状态,在处理器特权和非特权模式下都可以读写,主要控制位为第 0 位和第 1 位,第 3∶31 位为保留位,控制寄存器对应位的功能描述见表2.6。
表2.6 控制寄存器对应位的功能描述
续表
可以使用MRS和MSR指令来访问控制寄存器。
例如: