"); //-->
ARM处理器含有37个寄存器,这些寄存器包括以下两类寄存器。
(1)31个通用寄存器:包括程序计数器PC等,这些寄存器都是32位寄存器。
(2)6个状态寄存器:状态寄存器也是32位的寄存器,但是只使用了其中的12位。
1.通用寄存器
在ARM处理器的7种模式下都有一组对应的寄存器组。在任意时刻,可见的寄存器组包括15个通用寄存器R0~R14、一个或两个状态寄存器和PC。在所有的寄存器中,有些是各种模式下共用的同一个物理寄存器,有些是各种模式自己独立拥有的物理寄存器。详细如表1-3所示。
表1-3 ARM物理寄存器
用户模式 |
系统模式 |
特权模式 |
中止模式 |
未定义指令模 |
外部中断模 |
快速中断模 |
R0 |
R0 |
R0 |
R0 |
R0 |
R0 |
R0 |
R1 |
R1 |
R1 |
R1 |
R1 |
R1 |
R1 |
R2 |
R2 |
R2 |
R2 |
R2 |
R2 |
R2 |
R3 |
R3 |
R3 |
R3 |
R3 |
R3 |
R3 |
R4 |
R4 |
R4 |
R4 |
R4 |
R4 |
R4 |
R5 |
R5 |
R5 |
R5 |
R5 |
R5 |
R5 |
R6 |
R6 |
R6 |
R6 |
R6 |
R6 |
R6 |
R7 |
R7 |
R7 |
R7 |
R7 |
R7 |
R7 |
R8 |
R8 |
R8 |
R8 |
R8 |
R8 |
R8_fiq |
R9 |
R9 |
R9 |
R9 |
R9 |
R9 |
R9_fiq |
R10 |
R10 |
R10 |
R10 |
R10 |
R10 |
R10_fiq |
R11 |
R11 |
R11 |
R11 |
R11 |
R11 |
R11_fiq |
R12 |
R12 |
R12 |
R12 |
R12 |
R12 |
R12_fiq |
R13 |
R13 |
R13_svc |
R13_abt |
R13_und |
R13_irq |
R13_fiq |
R14 |
R14 |
R14_svc |
R14_abt |
R14_und |
R14_irq |
R14_fiq |
PC |
PC |
PC |
PC |
PC |
PC |
PC |
CPSR |
CPSR |
CPSR |
CPSR |
CPSR |
CPSR |
CPSR |
|
|
SPSR_svc |
SPSR_abt |
SPSR_und |
SPSR_irq |
SPSR_fiq |
通用寄存器通常又可以分为下面3类。
n 未备份寄存器:包括R0~R7。
n 备份寄存器:包括R8~R14。
n 程序计数器PC:即R15。
1)未备份寄存器R0~R7
对于每个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器,在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器中数据被破坏。未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未备份寄存器。
2)备份寄存器R8~R14
备份寄存器中的每个寄存器对应于两个不同的物理寄存器。例如,当使用快速中断模式下的寄存器时,寄存器R8和寄存器R9分别记做R8_fiq和 R9_fiq,当使用用户模式下的寄存器时,寄存器R8和寄存器R9分别记做R8_usr和R9_usr等。在这两种情况下使用的是不同的物理寄存器,系统没有将这几个寄存器用于任何的特殊用途。中断处理非常简单,仅仅使用R8~R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程很迅速。
对于备份寄存器R13、R14来说,每个寄存器对应于6个不同的物理寄存器,其中的一个是用户模式和系统模式共用的,另外的5个则对应于其他5种处理器模式,采用下面的方法来标识。
R13_<mode>,
其中<mode>是usr、svc、abt、und、irq和fiq的一种。
R13通常用做堆栈指针。每一种模式都拥有自己的物理R13。程序初始化R13,使其指向该模式专用的栈地址。当进入该模式时,可以将需要使用的寄存器保存在R13所指的栈中,当退出该模式时,将保存在R13所指的栈中的寄存器值弹出。这样就实现了程序的现场保护。
寄存器R14又被称为连接寄存器(LR),在ARM中有下面两种特殊用途。
① 每一种处理器模式在自己的物理R14中存放当前子程序的返回地址。当通过BL或者BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,就实现了子程序返回。
可以通过下面两种方式实现这种子程序的返回操作。
◆执行下面任何一条指令
MOV pc, LR
BX LR
◆在子程序入口使用下面指令将PC保存到栈中:
STMFD SP!, {registers}, LR}
相应地,下面的指令可以实现子程序的返回:
LDMFD SP!, { registers}, LR }
② 当发生异常中断的时候,该模式下的特定物理R14被设置成该异常模式将要返回的地址。对于某些异常,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与上面的子程序返回方式基本相同。
3)程序计数器PC→R15
程序计数器R15又被记作PC。它虽然可以作为一般的通用寄存器使用,但是有一些指令在使用R15时有一些特殊限制。当违反了这些限制时,该指令执行的结果将是不可预料的。
假设R0指向可用的一个内存字,下面代码可以在R0指向的内存字中返回该芯片所采用的地址偏移量。
SUB R1, PC, #4 ;R1中存放下面STR指令的地址
STR PC, [R0] ;将PC=STR地址+offset保存到R0中
LDR R0, [R0] ;
SUB R0, R0, R1 ;offset=PC-STR地址
2.程序状态寄存器
CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。每一种模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常退出时,可以用 SPSR中保存的值来恢复CPSR。CPSR的具体格式如下。
31 |
30 |
29 |
28 |
27 |
26 |
7 |
6 |
5 |
4 |
3 |
21 |
0 |
N |
Z |
C |
V |
Q |
DNMLRAZ |
I |
F |
I |
M4 |
M3 |
M |
M0 |
1)条件标志位
N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。大部分的ARM指令可以依据CPSR中的这些标志位来选择性地执行。各条件标志位的具体含义,如表1-4所示。
表 CPSR标志位含义
标志位 |
含 义 |
N |
本位设置成当前指令运算结果的bit[31]的值 当两个补码表示的有符号整数运算时,N=1表示运算的结果为负数,N=0 表示结果为正数或零 |
Z |
Z=1表示运算结果是0,Z=0表示运算结果不是零 对于CMP指令,Z=1表示进行比较的两个数大小相等 |
C |
在加法指令中(包括比较指令CMN),结果产生进位了,则C=1,表示无符号数运算发生上溢出,其他情况下C=0 在减法指令中(包括比较指令CMP),结果产生借位了,则C=0,表示无符号数运算发生下溢出,其他情况下C=1 对于包含移位操作的非加/减法运算指令,C中包含最后一次被溢出的位的数值,对于其他非加/减法运算指令,C位的值通常不受影响 |
V |
对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出 其他的指令通常不影响V位 |
2)Q标志位
在ARM v5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的DSP指令是否发生了溢出,同样的,SPSR的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。
3)CPSR中的控制位
CPSR的低8位I、F、T及M[4:0]统称为控制位,当异常中断发生时这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。
① I中断禁止位
当I=1时禁止IRQ中断。
当F=1时禁止FIQ中断。
通常一旦进入中断服务程序可以通过置位I和F来禁止中断,但是在本中断服务程序退出前必须恢复原来I、F位的值。
② T控制位,用来控制指令执行的状态,即说明本指令是ARM指令还是Thumb指令。对于不同版本的ARM处理器,T控制位的含义是有些不同的。
对于ARM v3及更低的版本和ARM v4的非T系列版本的处理器,没有ARM和Thumb指令的切换,所以T始终为0。
对于ARM v4及更高版本的T系列处理器,T控制位含义如下。
当T=0,表示执行ARM指令。
当T=1,表示执行Thumb指令。
对于ARM v5及更高的版本的非T系列处理器,T控制位的含义如下。
当T=0表示执行ARM指令。
当T=1表示强制下一条执行的指令产生为定义指令中断。
③ M 控制位
控制位M[4:0]称为处理器模式标识位,具体说明如表1-5所示。
表1?5 CPSR 处理器模式位
M[4:0] |
处理器模式 |
可访问的寄存器 |
0b10000 |
User |
PC,R14~R0,CPSR |
0b10001 |
FIQ |
PC,R14_fiq~R8_fiq,R7~R0,CPSR,SPSR_fiq |
0b10010 |
IRQ |
PC,R14_irq~R13_irq,R12~R0,CPSR,SPSR_irq |
0b10011 |
Supervisor |
PC,R14_svc~R13_svc,R12~R0,CPSR,SPSR_svc |
0b10111 |
Abort |
PC,R14_abt~R13_abt,R12~R0,CPSR,SPSR_abt |
0b11011 |
Undefined |
PC,R14_und~R13_und,R12~R0,CPSR,SPSR_und |
0b11111 |
System |
PC,R14~R0,CPSR(ARM v4及更高版本) |
④CPSR的其他位用于将来ARM版本的扩展,程序可以先不操作这些位。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。