ARM运行模式
用户模式(User):ARM处理器正常的程序执行状态。
快速中断模式(FIQ):用于高速数据传输或通道处理。
外部中断模式(IRQ):用于通用的中断处理。
管理模式(Supervisor):操作系统使用的保护模式。
数据访问终止模式(Abort):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
系统模式(System):运行具有特权的操作系统任务。
未定义指令中止模式(Undifined):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
上面7种运行模式除了用户模式外均属于“特权”模式,“特权”模式下CPU可以访问受保护的系统资源。
ARM工作模式
ARM处理器有两种工作状态:ARM状态和Thumb状态。处理器可以在两种状态之间随意切换。当处理器处于ARM状态时,会执行32位字对齐的ARM指令,当处于Thumb状态时,执行的是16位对齐的Thumb指令。Thumb状态下对寄存器的命名与ARM有部分差异,他们的关系如下:
Thumb状态下的R0~R7与ARM状态下的R0~R7相同。
Thumb状态下的CPSR与ARM状态下的CPSR相同。
Thumb状态下的FP对应于ARM状态下的R11。
Thumb状态下的IP对应于ARM状态下的R12。
Thumb状态下的SP对应于ARM状态下的R13。
Thumb状态下的LR对应于ARM状态下的R14。
Thumb状态下的PC对应于ARM状态下的R15。
寄存器
寄存器是CPU内部用来存放数据的一些小型存储区域,和内存比起来CPU可以高效的读写寄存器,所以在各个CPU支持的汇编指令中都不会看到直接对两个内存间数据的处理的,都需要寄存器进行中转。
ARM微处理器共有37个寄存器,其中31个为通用寄存器,6个为状态寄存器,所有处理器均为32位。在ARM处理器不同运行模式下的寄存器用途也不同,在ARM处理器的不同工作状态下会对部分寄存器重命名,主要体现在汇编指令上。
31个通用寄存器又分为:未分组寄存器(R0~R7)、分组寄存器(R8~R14)和程序计数器(R15).
System&User | FIQ | IRQ | Supervisor | Abort | Undifined |
---|---|---|---|---|---|
R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 |
R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8_FIQ | R8 | R8 | R8 | R8 |
R9 | R9_FIQ | R9 | R9 | R9 | R9 |
R10 | R10_FIQ | R10 | R10 | R10 | R10 |
R11 | R11_FIQ | R11 | R11 | R11 | R11 |
R12 | R12_FIQ | R12 | R12 | R12 | R12 |
R13 | R13_FIQ | R13_IRQ | R13_ABT | R13_SVC | R13_UND |
R14 | R14_FIQ | R14_IRQ | R14_ABT | R14_SVC | R14_UND |
R15(pc) | R15(pc) | R15(pc) | R15(pc) | R15(pc) | R15(pc) |
未分组寄存器R0~R7
在所有运行模式下,未分组寄存器都指向同一个物理寄存器,它们未被系统用作特殊的用途。
在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,所以可能造成寄存器中数据的破坏。
分组寄存器R8~R14
不同模式下,CPU会使用对应模式下特有的寄存器。
R13(SP)寄存器,在ARM汇编指令中通常作为堆栈指针使用,在Thumb工作模式下强制使用SP(R13)作为堆栈指针。
由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化时,一般都要初始化每种模式下的R13,使其指向该运行模式下的栈空间。这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。
R14 (LR)寄存器,称为链接寄存器(Link Register),当执行子程序调用指令(BL)时,R14可得到R15(程序计数器PC)的备份.
程序计数器PC(R15)
R15(PC)寄存器,用作程序计数器。在ARM状态下,位[1:0]为0,位[31:2]用于保存PC,在Thumb状态下,位[0]为0,位[31:1]用于保存PC。
由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。
程序状态寄存器R16(CPSR)
寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。
每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。
由于用户模式和系统模式不属于异常模式,它们没有SPSR,当在这两种模式下访问SPSR,结果是未知的