一、ARM处理器共有7种运行模式
usr是普通模式,其他六种是特权模式(Privileged Modes),在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。除了usr和sys模式以外的五种模式又被称为异常模式。
处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换。大多数的用户程序运行在用户模式下。这时,应用程序不能够访问一些受操作系统保护的系统资源。应用程序也不能直接进行处理器模式的切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理过程中进行处理器模式的切换。这种体系结构可以使操作系统控制整个系统的资源。
当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常模式中都有一组寄存器,供相应的异常处理程序使用,这样就可以保证在进入异常模式时,用户模式下的寄存器(保存了程序运行状态)不被破坏。
系统模式(sys)并不是通过异常过程进入的,它和用户模式具有完全一样的寄存器。但是系统模式属于特权模式,可以访问所用的系统资源,也可以直接进行处理器模式切换。它主要供操作系统任务使用。通常操作系统的任务需要访问所有的系统资源,同时该任务仍然使用用户模式的寄存器组,而不是使用异常模式下相应的寄存器组,这样可以保证当异常中断发生时任务状态不被破坏。
二、ARM寄存器
ARM处理器共有37个寄存器。包括:31个通用寄存器和6个状态寄存器,他们都是32位的。
1、31个通用寄存器可用分为3类:未备份寄存器,包括R0~R7、备份寄存器,包括R8~R14、程序计数器PC,即R15。
1)、未备份寄存器,包括R0~R7。对于未备份寄存器来说,在所以处理器模式下指的都是同一个物理寄存器。在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器中数据被破坏。未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用。
2)、备份寄存器,对于备份寄存器R8~R12来说,每个寄存器对应两个不同的物理寄存器。例如,当使用快速中断模式下的寄存器时,寄存器R8和寄存器R9分别记作R8_fiq、R9_fiq;当使用用户模式下的寄存器时,寄存器R8和寄存器R9分别记作R8_usr、R9_usr时等。在这两种情况下,使用的是不同的物理寄存器。系统没有将这几个寄存器用于任何特殊用途,但是当中断处理非常简单,仅仅使用R8~R14寄存器时,FIQ处理程序可以不必执行保存和候复中断现场的指令,从而可以使中断处理过程非常迅速,c从而达到快速中断的目的。
3)、对于备份寄存器R13和R14来说,每个寄存器对应6个不同的物理寄存器,其中一个是用户模式和系统模式共用的。记作:R13_usr、R13_svc、R13_abt、R13_und、R13_irq、R13_fiq。
寄存器R13在ARM中常用作栈指针。在ARM指令集中,这只是一种习惯的用法,并没有任何指令强制性地使用R13作为栈指针,用户也可以使用其他的寄存器作为栈指针;而在Thumb指令集中,有一些指令强制性地使用R13作为栈指针。每一种异常模式都拥有自己的物理的R13。应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中:当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被其中断程序的运行现场。
寄存器R14又被称为连接寄存器(Link Register,LR),在ARM体系中具有下面两种特殊的作用:
A、每一种处理器模式自己的物理R14中存放着当前子程序的返回地址。当通过BL或BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回。
B、当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要返回的地址。对于有些异常模式,R14的值可能与将要返回的地址有一个常数的偏移量。
4)、程序计数器R15,当成功地向R15写入一个地址数值时,程序将跳转到该地址执行。
2、程序状态寄存器
CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR。
由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR。当在用户模式或系统模式中访问SPSR时,将会产生不可预知的结果。
CPSR的格式如下所示。SPSR格式与CPSR格式相同。
N(Negative):当两个补码表示的有符号整数运算时,1表示运算结果为负数,0表示结果为正或零。
Z(Zero):1表示运算的结果为零,0表示运算的结果不为零。对于CMP指令,1表示进行比较的两个数大小相等。
C(Carry):下面分四种情况讨论C的设置方法:
a)加法运算(包括比较指令CMN):当运算产生了进位时(无符号数溢出),C=1,否则C=0。
b)减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。
c)对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
d)对于其他的非加/减运算指令,C的值通常不改变。
V(oveRFlow):下面分两种情况讨论V的设置方法
a)对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。
b)对于其他的非加/减运算指令,V的值通常不改变。
CPSR的低8位I、F、T、M[4:0]统称为控制位。当异常中断发生时,这些位发生变化。
I:1 表示禁止外部(硬件)中断(IRQ)
F:1 表示禁止快速中断(FIQ)
T:1表示为thumb状态,0为arm状态
M[4:0]:用来设置处理器的工作模式。
各种处理器模式下的寄存器表(共37个):
|