处理器在运行程序时处于THUMB状态,处理器既可以处于线程模式,也可以处在处理模式。
调试状态下,调试器可以读取甚至可以改变内核寄存器的值。
不论是在Thumb或者是调试状态下,调试器都可以系统存储器空间。
处理器上电以后,默认处在Thumb状态和线程模式。
3.3.2 寄存器和特殊寄存器
数据解析和控制处理的过程中,需要处理器内核的多个寄存器参与。
“加载-存储架构” ---------如果需要处理存储器中的数据***,这些数据首先就要被加载到处理器内核的寄存器*(寄存器组中的某个),处理完后,它们还将会被送到存储器中。
使用内部寄存器实现短期的数据存储时,存储器操作的次数也会减少。
寄存器组中包含了16个32位的寄存器,他们大多是通用的吗,有些是具有特殊用途的。
注意,这里的寄存器组中的具有特殊用途的寄存器不等于以下所说的特殊寄存器。
除了这包含这16个寄存器在内的寄存器组以外,Cortex-M0还具有三个特殊寄存器,分别是程序状态寄存器(xPSR),中断屏蔽寄存器,以及栈定义。
R0-R12为通用寄存器
由于16位的Thumb指令集在空间上的限制,许多Thumb指令只能操作R0.到R7,它们也被称作低寄存器(low registers),而像MOV之类的一些指令则可以使用全部的寄存器。在使用ARM汇编器之类的ARM开发工具操作这些寄存器时,寄存器的写法可以用大写(如R0),也可以用小写(如r0)。
R0~R12寄存器的初始值未定义。
R13为栈指针
用于对栈空间的存取操作(通过PUSH和POP指令) ,Cortex-M0在不同的物理位置上存在两个栈指针。主栈指针(MSP,在ARM文档中也被称作SP_ main)为上电后的默认指针,用于异常处理。另外一个称作进程栈指针(PSP,在ARM文档也被称作SP_ process) ,只能用在线程模式(Thread mode)。可以通过配置CONTROL寄存器,选择使用哪个栈指针,CONTROL寄存器之后将会介绍。使用ARM开发工具编写程序代码时,程序员可以使用“R13”或者“SP"来操作栈指针。
在ARM处理器中,由于寄存器是32位的,故PUSH和POP指令永远是32位操作,而且存取的地址须是32位字对齐的。在处理器上电流程中,中断向量表的头4字节会被取出,然后填充到MSP,作为MSP的初始值。PSP 的初始值未定义。
PSP一般是没有必要使用的,对于许多应用,系统完全依赖MSP.使用操作系统的设计通常会用到PSP,这是因为操作系统内核的栈空间和线程级的应用程序的栈空间是相互独立的。
R14为链接寄存器
用于存储子程序或者函数调用的返回地址。子程序或函数执行完毕,存储在LR中的返回地址将被装载到程序计数器(PC)中,以便调用程序可以继续执行。当发生异常中断时,LR会提供一个特定值,用于中断返回机制。在使用ARM开发工具编写代码时,我们可以通过R14或LR访问链接寄存器,而且不区分大小写(可以书写为r14或lr)。
尽管Cortex-M0处理器的函数返回地址始终是偶数(最低位为0,因为最小的指令都是16位,也就是半字对齐的),LR的0位却是可读可写的。对于ARMv6-M体系结构,为了指明当前处于Thumb状态,一些指令需要函数地址的最低位为1.
R15为程序计数器
并且可读可写。读操作返回当前正在执行的指令地址加上4(这是由流水线的特性决定的),而写入R15会导致程序跳转执行(和函数调用不同,链接寄存器不会更新)。
在ARM汇编器中,可以用R15或PC来操作程序计数器,大小写均可(也可以写作r15或pc)。Cortex MO处理器的指令地址须是半字(也就是16位)对齐的,这也就意味着PC寄存器的最低位必须始终为0**。不过,在使用跳转指令(BX或BLX)执行程序跳转时,PC的最低位应该被置为1,以表明目标分支处于Thumb程序区域。如果试图切换至Cortex-M0未知的ARM状态,错误异常中断就会被触发。