ARM内部寄存器

在arm7tdmi处理器内部有37个用户可见的寄存器。
在不同的工作模式和处理器状态下,程序员可以访问的寄存器也不尽相同.
所有的37个寄存器,分成两大类:(1)31个通用32位寄存器;(2)6个状态寄存器。
在汇编语言中寄存器r0~r13为保存数据或地址值的通用寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于任何使用通用寄存器的指令。
其中r0~r7为未分组的寄存器,也就是说对于任何处理器模式,这些寄存器都对应于相同的32位物理寄存器。
寄存器r8~r14为分组寄存器。它们所对应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都允许使用分组寄存器
寄存器r8~r12有两个分组的物理寄存器。一个用于除fiq模式之外的所 有寄存器模式,另一个用于fiq模式。这样在发生fiq中断后,可以加速fiq的处理速度。
寄存器r13、r14分别有6个分组的物理寄存器。一个用于用户和系统模式,其余5个分别用于5种异常模式。
寄存器r13常作为堆栈指针(sp)。在arm指令集当中,没有以特殊方式使用r13的指令或其它功能,只是习惯上都这样使用。但是在thumb指令集中存在使用r13的指令。
r14为链接寄存器(lr),在结构上有两个特殊功能:
在每种模式下,模式自身的r14版本用于保存子程序返回地址;
当发生异常时,将r14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。
r14寄存器与子程序调用
操作流程:
1.程序a执行过程中调用程序b;
2.程序跳转至标号lable,执行程序b。同时硬件将“bl lable”指令的下一条指令所在地址存入r14;
3.程序b执行最后,将r14寄存器的内容放入pc,返回程序a;
r14寄存器与异常发生
异常发生时,程序要跳转至异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成的。区别在于有些异常有一个小常量的偏移。
r14寄存器注意要点
当发生异常嵌套时,这些异常之间可能会发生冲突。
例如:如果用户在用户模式下执行程序时发生了irq中断,用户模式寄存器不会被破坏。但是 如果允许在irq模式下的中断处理程序重新使能irq中断,并且发生了嵌套的irq中断时,外部中断处理程序保存在r14_irq中的任何值都将被嵌套中断的返回地址所覆盖。
解决办法是确保r14的对应版本在发生中断嵌套时不再保存任何有意义的值(将r14入栈),或者切换到其它处理器模式下。 寄存器r15为程序计数器(pc),它指向正在取指的地址。可以认 为它是一个通用寄存器,但是对于它的使用有许多与指令相关的限制或特殊情况。如果r15使用的 方式超出了这些限制,那么结果将是不可预测的。
读r15的限制
正常操作时,从r15读取的值是处理器正在取指的地址,即当前正在执行指令的地址加上8个字节(两条arm指令的长度)。由于arm指令总是以字为单位,所以r15寄存器的最低两位总是为0。
当使用str或stm指令保存r15时,会有一个例外。这些指令可能将当前指令地址加8字节或加12字节保存(将来可能还有其它数字)。偏移量是8还是12取决于具体的arm芯片,但是对于一个确定的芯片,这个值是一个常量。
所以最好避免使用str和stm指令来保存r15,如果很难做到,那么应当在程序中计算出该芯片的偏移量。
“写r15的限制”
正常操作时,写入r15 的值被当作一个指令地址,程序从这个地址处继续执行(相当于执行一次无条件跳转)。
由于arm指令以字节为边界,因此写入r15的值最低两位通常为0b00。具体的规则取决于内核结构的版本:
(1)在arm结构v3版及以下版本中,写入r15的值的最低两位被忽略,因此跳转地址由指令的实际目标地址(写入r15的值)和0xfffffffc相与得到;
(2)在arm结构v4版及以上版本中,写入r15的值的最低两位为0,如果不是,结果将不可预测。
寄存器cpsr为程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(spsr)”可以被访问。每种异常都有自己的spsr,在进入异常时它保存cpsr的当前值,异常退出时可通过它恢复cpsr。详细描述参看3.8小节。
thumb状态寄存器
thumb状态寄存器集是arm状态集的子集,程序员可以直接访问的寄存器为:
(1)8个通用寄存器r0~r7;(2)程序计数器(pc);(3)堆栈指针(sp);(4)链接寄 存器(lr);(5)有条件访问程序状态寄存器(cpsr)。
在汇编语言中寄存器r0~r7为保存数据或地址值的通用寄存器。对于任何处理器模式,它们中的每一个都对应于相同的32为物理寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊的用途,并且可用于任何使用通用寄存器的指令。
堆栈指针sp对应arm状态的寄存器r13。每个异常模式都有其自身的sp分组版本,sp通常指向各异常模式所专用的堆栈。
注意:在发生异常时,处理器自动进入arm状态。
链接寄存器lr对应arm状态寄存器r14,在结构上有两个特殊功能,详见“arm状态下的链接寄存器lr”。
注意:在发生异常时,处理器自动进入arm状态。
arm状态和thumb状态之间寄存器的关系
thumb状态寄存器与arm状态寄存器有如下的关系:
(1)thumb状态r0~r7与arm状态r0~r7相同;
(2)thumb状态cpsr和spsr与arm状态cpsr和spsr相同;
(3)thumb状态sp映射到arm状态r13;
(4)thumb状态lr映射到arm状态r14;
(5)thumb状态pc映射到arm状态pc(r15)。
下面讲一下,在thumb状态中访问高寄存器:
在thumb状态中,高寄存器(r8~r15)不是标准寄存器集的一部分。汇编语言程序员对它们的访问受到限制,但可以将它们用于快速暂存。
可以使用mov、cmp和add指令对高寄存器操作。