3.6 寄存器

处理器处理数据和执行程序都必须要用到寄存器。寄存器是包含在处理器内部的一种高速的暂存器,用于存放访存地址、临时数据和计算结果,大多数情况下其大小和处理器的字长相等,比如ARM920T的寄存器都是4字节32位的,下面就去看看ARM920T处理器到底有哪些寄存器。

ARM920T处理器是RISC体系的,这种体系最明显的特点就是有大量的寄存器。ARM920T处理器一共有多达37个寄存器。这37个寄存器大致可分为以下几类:

□通用寄存器。

□栈指针寄存器。

□程序链接寄存器。

□程序指针寄存器。

□程序状态寄存器。

这37个寄存器都是32位的,虽然有些寄存器只用到其中的几位,如程序状态寄存器,但是它仍然是32位的。对程序代码来说,同一时刻最多能看到18个寄存器,这取决于ARM920T处理器的运行状态和工作模式,如图3-6所示。

图3-6 ARM920T的寄存器

为什么会这样?因为ARM公司采用了一种称为“备份寄存器”的技术,不同的工作模式下,虽然使用了相同的寄存器名称,但是操作的却不是同一个物理寄存器。比如,在快速中断模式下向R13寄存器中写入“0”值,但这并不会改变其他模式下R13寄存器中的值。这些寄存器的分布如下。

1)R0~R7、R15、CPSR:这几个寄存器在所有的工作模式下都使用相同的物理寄存器。

2)R8~R12:这些寄存器除快速中断模式外,其他工作模式都使用相同的物理寄存器。

3)R13、R14:这两个寄存器除系统模式和用户模式下使用相同的物理寄存器,其他工作模式都使用各自的备份寄存器,即不同的物理寄存器。

4)SPSR:在系统模式和用户模式下没有这个寄存器,其他工作模式都有各自的SPSR备份物理寄存器。比如,在快速中断模式下访问SPSR,访问的是快速中断模式下的SPSR物理寄存器,在系统管理模式下访问SPSR,访问的是系统管理模式下的SPSR物理寄存器。

下面分别介绍这些寄存器。

(1)R0~R7寄存器

R0~R7这8个寄存器可以称为“通用寄存器”,也可以称为“低寄存器”。这8个寄存器没有用备份寄存器,也就是说ARM920T处理器不管运行在哪个工作模式下,对R0~R7的操作都是访问同一个物理寄存器。如果ARM920T工作在Thumb状态下,那么就只能访问这8个通用寄存器。

(2)R8~R12寄存器

R8~R12这5个寄存器也是通用寄存器,同时也可以称为“高寄存器”。这5个寄存器除快速中断模式使用了备份寄存器,其他工作模式都使用相同的物理寄存器。也就是说,除快速中断模式外,ARM920T处理器不管运行在哪个工作模式下,对R8~R12的操作都是访问的同一个物理寄存器。如果ARM920T处理器工作在Thumb状态下,那么就不能访问这5个通用寄存器。快速中断模式用于处理高速设备的中断,中断处理过程需要首先保存大量的寄存器,即运行中断处理程序之前的CPU上下文。现在ARM920T处理器在响应快速中断时,就不需要保存R8~R12这5个寄存器,因为在快速中断模式下ARM920T处理器有R8~R12这5个备份物理寄存器,在快速中断模式下使用这5个寄存器,并不会影响其他模式下的R8~R12寄存器,同时也加快了中断处理速度。

(3)R13寄存器

R13寄存器,又可以称为SP寄存器,这个寄存器除系统模式和用户模式共用相同的物理寄存器外,其他处理器工作模式都有各自的物理备份寄存器。这个寄存器常用作栈指针寄存器。栈是一块内存空间,它存放数据有一定的规则,必须后进先出即最后存放进去的数据要最先取出来,栈指针寄存器的值始终指向最后存放数据的内存地址。如果要用C语言写程序就必须要用到栈。因为函数调用和函数中的局部变量都会用到栈。在ARM920T处理器上从用户模式切换到系统管理模式下,程序的栈也会随着切换,因为用户模式和系统管理模式的R13寄存器不是同一个物理寄存器。相应的其他模式也一样,除用户模式和系统模式之间切换不会切换栈,其他模式的切换,程序的栈也会随着切换。另外如果ARM920T工作在Thumb状态下也能用这个R13寄存器作为栈指针寄存器。

(4)R14寄存器

R14寄存器,又可以称为LR寄存器,这个寄存器除系统模式和用户模式共用相同的物理寄存器外,其他处理器工作模式都有各自的物理备份寄存器。这个寄存器常用作程序链接寄存器。我们的程序中有分支代码和函数调用,这就要使用跳转指令,对函数调用后要返回,当我们用带返回的跳转指令时,这条指令就会把当前指令的下一条指令的地址放进处理器当前模式下的R14寄存器中,函数返回时只要将R14寄存器的内容送给程序指针寄存器就行了。如果处理器响应中断、异常,处理器会自动将当前模式下的程序指针寄存器的内容放在相应中断、异常模式下的R14寄存器中,后面会详细介绍。另外,如果ARM920T工作在Thumb状态下,也能用这个R14寄存器作为程序链接寄存器。其作用也和上面说的一样。

(5)R15寄存器

R15寄存器,又可以称为PC寄存器,即程序指针寄存器。这个寄存器在所有的工作模式下都共用相同的物理寄存器,并且在Thumb状态下也是使用这个寄存器作为程序指针寄存器。它总是指向下一条要读取代码指令的地址,除跳转指令之外,每读取一条代码指令,处理器就会自动对这个R15寄存器加上一条指令的存储大小,使其指向下一条要读取代码指令的地址。当处理器处于ARM状态时,该寄存器中的值始终是字对齐的,而处理器处于Thumb状态时该寄存器中的值始终是半字对齐的。这个寄存器还可以用于数据的相对寻址,后面我们可以看到它神奇的作用。

(6)CPSR寄存器

这个寄存器有点复杂,我们慢慢看。CPSR寄存器,即当前程序状态寄存器。这个寄存器在所有的工作模式下都共用相同的物理寄存器,并且在Thumb状态下也是使用这个寄存器作为程序的状态寄存器。CPSR也是32位的,但却没有完全用到32位,也就是说有许多位是保留而留作后用的。它里面保存了如下信息,如图3-7所示。

图3-7 CPSR寄存器

1)模式位:控制处理器的运行模式,如表3-1所示。

表3-1 CPSR寄存器模式位

注:0b表示它后面的数字是二进制数。

2)CPSR T位:控制处理器的运行状态,如表3-2所示。

表3-2 CPSR寄存器T位

注:0b表示它后面的数字是二进制数。

3)CPSR I、F位:控制中断的使能与禁止,如表3-3所示。

表3-3 CPSR寄存器I、F位

注:0b表示它后面的数字是二进制数。

4)CPSR[N、Z、C、V]位:保存了最近处理器的运算部件执行的信息,即运行了某些数据运算指令后的状态,如表3-4所示。

表3-4 CPSR寄存器N、Z、C、V位

5)保留位。在程序中最好不要使用。这些位可能被ARM公司在未来的ARM处理器另作他用。

(7)SPSR寄存器

SPSR寄存器,即程序状态备份寄存器。除系统模式和用户模式下没有这个寄存器外,其他处理器工作模式都有各自的物理备份寄存器,并且在Thumb状态下也是使用这个寄存器作为程序状态备份寄存器。当处理器响应中断、异常时,处理器会自动将CPSR寄存器的内容放在相应中断、异常模式下的SPSR寄存器中,当中断、异常处理返回时,就将该工作模式下SPSR寄存器的内容写入CPSR中。这其中有些步骤是ARM920T处理器硬件负责完成的,后面会详细介绍的。