原文地址:点击打开链接
一、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)寄存器R13在ARM中常用作栈指针(Stack Point,SP)
- 在ARM指令集中,这只是一种习惯的用法,并没有任何指令强制性的使用R13作为栈指针,用户也可以使用其他的寄存器作为栈指针;而在Thumb指令集中,有一些指令强制性地使用R13作为栈指针。
- 每一种异常模式拥有自己的物理的R13。应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中;当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被其中断程序的运行现场。
(3)寄存器R14又被称为连接寄存器(Link Register,LR)
- 在ARM体系中具有下面两种特殊的作用:每一种处理器模式自己的物理R14中存放在当前子程序的返回地址。当通过BL或BLX指令调用子程序时,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
|
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
|
对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时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指令进行比较或加上低位寄存器中的值。