ARM处理器模式及寄存器

来源:互联网 发布:淘宝的trw轮毂好用么 编辑:程序博客网 时间:2024/05/16 07:09

原文地址:点击打开链接

一、ARM处理器模式:
  • ARM微处理器支持7种运行模式,分别为:
用户模式(usr):       ARM处理器正常的程序执行状态。
快速中断模式(fiq):用于高速数据传输或通道处理。
外部中断模式(irq):用于通用的中断处理。
管理模式(svc):       操作系统使用的保护模式。软中断和复位
数据访问中止模式(abt):     当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
系统模式(sys):                     运行具有特权的操作系统任务。
未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真
  • 除用户模式外的其余6种模式都称为特权模式,这些模式下,程序可以访问所有的系统资源,也可以任一进行处理器模式切换。其中,除系统模式外,其他5种模式又称为异常模式


二、ARM寄存器


(一)ARM工作状态下的寄存器组织

ARM处理器共有37个寄存器。其中包括:
  • 31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器
  • 6个32位状态寄存器。
1  各种处理器模式下的寄存器
用户模式
系统模式
特权模式
中止模式
未定义指令模式
外部中断模式
快速中断模式
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
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_inq
R13_fiq
R14
R14
R14_svc
R14_abt
R14_und
R14_inq
R14_fiq
PC
PC
PC
PC
PC
PC
PC
CPSR
CPSR
CPSR
SPSR_svc
CPSR
SPSR_abt
CPSR
SPSR_und
CPSR
SPSR_inq
CPSR
SPSR_fiq


  • 当发生异常中断时,处理器进入相应的异常模式。在每一种异常模式下都有相应的一组寄存器,供相应的异常处理程序使用,这样就可以保证在进入异常模式时,用户模式下的寄存器(保存了程序运行状态)不被破坏。
  • 系统模式不是通过异常进入的,他和用户模式具有完全一样的寄存器

1、通用寄存器
通用寄存器通常分为以下三类:
未备份寄存器:R0——R7
备份寄存器:R8——R14
程序计数器PC,即R15
未备份寄存器R0——R7
R0~R7。在所有的处理器模式下指的都是同一个物理寄存器。在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器中数据被破坏。
备份寄存器R8~R14

(1)寄存器R8~R12

每个寄存器对应两个不同的物理寄存器。例如,当使用快速中断模式下的寄存器时,寄存器R8和寄存器R9分别记作R8_fiq、R9_fiq;当使用用户模式下的寄存器时,寄存器R8和寄存器R9分别记作R8_usr、R9_usr等。在这两种情况下使用的是不同的物理寄存器。系统没有将这几个寄存器用于任何的特殊用途,但是当中断处理非常简单,仅仅使用R8~R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程非常迅速。对于备份寄存器R13和R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式和系统模式共用的;另外的5个对应于其他5种处理器模式。
(2)寄存器R13ARM中常用作栈指针(Stack Point,SP)
  • ARM指令集中,这只是一种习惯的用法,并没有任何指令强制性的使用R13作为栈指针,用户也可以使用其他的寄存器作为栈指针;而在Thumb指令集中,有一些指令强制性地使用R13作为栈指针。
  • 每一种异常模式拥有自己的物理的R13。应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中;当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被其中断程序的运行现场。

(3)寄存器R14又被称为连接寄存器(Link RegisterLR)
  • ARM体系中具有下面两种特殊的作用:每一种处理器模式自己的物理R14中存放在当前子程序的返回地址。当通过BLBLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回。
  • 当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与上面的子程序返回方式基本相同。
  • R14寄存器也可以作为通用寄存器使用。

程序计数器R15(PC)

  • 程序计数器R15又被记作PC。它虽然可以作为一般的通用寄存器使用,但是有一些指令在使用R15时有一些特殊限制。当违反了这些限制时,该指令执行的结果将是不可预料的。
  • 由于ARM采用了流水线机制,当正确读取了PC的值时,该值为当前指令地址值加8个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。(因为ARM使用RISC精简指令集,ARM的一条指令所占内存为32位,4个字节。所以当一条指令正确读取时,该寄存器指向当前指令地址加8,即指向下两条指令的地址)
  • 当成功地向R15中写入一个地址数值时,程序将跳到该地址执行由于ARM指令是字对齐的所以PC值的第0位和第1位总为0。需要注意的是,当使用指令STR/STM保存R15时,保存的可能是当前指令地址值加8字节,也可能保存的是当前指令地址加12字节。到底是哪种方式,取决于芯片具体设计方式。无论如何,在同一芯片中,要么采用当前指令地址加8,要么采用当前指令地址加12,不能有些指令采用当前指令地址加8,另一些指令采用当前指令地址加12。因此对于用户来说,尽量避免使用STR/STM指令来保存R15的值。当不可避免这种使用方式时,可以先通过一些代码来确定所用的芯片使用的是哪种实现方式。
  • 对于ARM版本4以及更高的版本,程序必须保证写入R15寄存器的地址值的bits[1:0]为0b00;否则将会产生不可预知的结果。
  • 对于Thumb指令集来说,指令是半字对齐的。处理器将忽略bit[0],即写入R15的地址值首先与0XFFFFFFFE做与操作,再写入R15中。
  • 还有—些指令对于R15的用法有一些特殊的要求。比如,指令BX利用bit[0]来确定是ARM指令,还是Thumb指令。这种读取PC值和写入PC值的不对称的操作需要特别注意。
注:PC指向的地址是取指单元要取指令的地址,而不是当前执行的指令。
2、程序状态寄存器
CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器(CPSR)的内容。在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR。
由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR。当在用户模式或系统模式中访问SPSR,将会产生不可预知的结果。
CPSR的格式如下所示。SPSR格式与CPSR格式相同。
31
30
29
28
27
26
7
6
5
4
3
2
1
0
N
Z
C
V
Q
DNM(RAZ)
I
F
T
M4
M3
M2
M1
M0


1.条件标志位

N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。大部分的ARM指令可以根据CPSR中的这些条件标志位来选择性地执行。

在ARM状态下,绝大多数的指令都是有条件执行的。
在Thumb状态下,仅有分支指令是有条件执行的。

  N  Negative        对于有符号运算,如果结果是负数则置位  Z  Zero            如果结果是零则置位  C  Carry           对于无符号运算,如果发生进位则置位  V  Overflow        对于有符号运算,如果发生溢出则置位  I  IRQ             中断禁用  F  FIQ             快速中断禁用
标志位 
含  义
N
本位设置成当前指令运算结果的bit[31]的值
当两个补码表示的有符号整数运算时,N=1表示运算的结果为负数;N=0表示结果为正数或零
Z
Z=1表示运算的结果为零;Z=0表示运算的结果不为零。
对于CMP指令,Z=1表示进行比较的两个数大小相等。

C
下面分4种情况讨论C的设置方法:
在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出;其他情况下C=0。
在减法指令中(包括比较指令CMP),当运算中发生借位则C=0表示无符号数运算发生下溢出;其他情况下C=1。
对于包含移位操作的非加/减法运算指令,C中包含最后一次溢出的位数数值。
对于其他非加/减法运算指令,C位的值通常不受影响。
对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时V=1表示符号位溢出。
通常其他的指令不影响V位,具体可参考各指令的说明。

2.Q标志位

在ARMv5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的DSP指令是否发生了溢出。同样的SPSR中的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。
在ARM v5以前的版本及ARM v5的非E系列的处理器中,Q标志位没有被定义。CPSR的bit[27]属于DNM(RAZ)。


3.CPSR中的控制位

CPSR的低8位I、F、T及M[4:0]统称为控制位。当异常中断发生时这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。
1)  中断禁止位
  • I=1时禁止IRQ中断。
  • F=1时禁止FIQ中断。
2) T控制位   
      T控制位用于控制指令执行的状态,即说明本指令是ARM指令,还是Thumb指令。对与不同版本的ARM处理器,T控制位的含义不同。
      对于ARMv4以及更高版本的T系列的ARM处理器,
  • T=0表示执行ARM指令。
  • T=1表示执行Thumb指令。
    对于ARMv5以及更高的版本的非T系列的ARM处理器,T控制位含义如下:
  • T=0表示执行ARM指令。
  • T=1表示强制下一条执行的指令产生未定义指令中断。
3)M控制位
    控制位M[4:0]控制处理器模式,具体含义如表3所示。

                                           表3控制位M[4:0] 的含义
M[4:0]
处理器模式
可访问的寄存器
0b10000
User  
PC,R14一R0,CPSR
0b10001
FIQ   
PC,R14_fiq-R8_flq,R7~R0,CPSR,SPSR_nq
0b10010
1RQ
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
 
 
 
 

4.CPSR中的其他位

     CPSR中的其他位用于将来ARM版本的扩展。应用软件不要操作这些位,以免与ARM将来版本的扩展冲突。

(二)Thumb工作状态下的寄存器组织

Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集,程序可以直接访问8个通用寄存器(R7~R0)、程序计数器(PC)、堆栈指针(SP)、 连接寄存器(LR)和CPSR。同时,在每一种特权模式下都有一组SP、LR和SPSR。图2.4表明Thumb状态下的寄存器组织。



Thumb状态下的寄存器组织与ARM状态下的寄存器组织的关系:
       ─ Thumb状态下和ARM状态下的R0~R7是相同的。
       ─ Thumb状态下和ARM状态下的CPSR和所有的SPSR是相同的。
       ─ Thumb状态下的SP对应于ARM状态下的R13。
       ─ Thumb状态下的LR对应于ARM状态下的R14。
       ─ Thumb状态下的程序计数器对应于ARM状态下R15
以上的对应关系如图2.5所示:


访问THUMB状态下的高位寄存器(Hi-registers):
       在Thumb状态下,高位寄存器R8~R15并不是标准寄存器集的一部分,但可使用汇编语言程序受限制的访问这些寄存器,将其用作快速的暂存器。使用带特殊变量的MOV指令,数据可以在低位寄存器和高位寄存器之间进行传送;高位寄存器的值可以使用CMP和ADD指令进行比较或加上低位寄存器中的值。