ARM微处理器体系结构
数据类型
ARM微处理器的工作状态
ARM体系结构的存储器格式
理器模式
寄存器组织
状态下的寄存器组织
状态下的寄存器组织
异常
ARM微处理器体系结构
数据类型
ARM处理器支持以下数据类型:
••字(Word):字的长度为32位,而在8位/16
位处理器体系结构中,字的长度一般为16位,请
注意区分。
••半字(Half-Word):半字的长度为16位,与8位
/16位处理器体系结构中字的长度一致。
••字节(Byte):各种处理器体系结构中,字节
的长度均为8位。
ARM微处理器的工作状态
从编程的角度看,ARM微处理器的工作状态
一般有两种,并可在两种状态之间切换:
ARM状态,此时处理器执行32位的字对
齐的ARM指令;
Thumb状态,此时处理器执行16位的、
半字对齐的Thumb指令。
ARMARM处理器在两种工作状态之间可以处理器在两种工作状态之间可以切换切换::
进入进入ThumbThumb状态状态。。
当操作数寄存器的状态位当操作数寄存器的状态位((位位[0])[0])为为11时,执行时,执行BXBX指指
令进入令进入ThumbThumb状态。如果处理器在状态。如果处理器在ThumbThumb状态进入异状态进入异
常,则当异常处理常,则当异常处理(IRQ(IRQ、、FIQFIQ、、UndefUndef、、Abort Abort 和和 SWI) SWI)
返回时,自动转换到返回时,自动转换到ThumbThumb状态。状态。
进入进入ARMARM状态状态。。
当操作数寄存器的状态位当操作数寄存器的状态位((位位[0])[0])为为00时,执行时,执行BXBX指指
令进入令进入ARMARM状态。处理器进行异常处理状态。处理器进行异常处理(IRQ(IRQ、、FIQFIQ、、
ResetReset、、UndefUndef、、Abort Abort 和和 SWI SWI ARMARM状态执行状态执行))。在此情况。在此情况
下,把下,把PC PC 放人异常模式链接寄存器中。从异常向量地放人异常模式链接寄存器中。从异常向量地
址开始执行也可以进入址开始执行也可以进入ARMARM状态。状态。
ARM体系结构的存储器格式
ARM体系结构将存储器看作是从零地址开
始的字节的线性组合。
从零字节到三字节放置第一个存储的字数
据,从第四个字节到第七个字节放置第二个存
储的字数据,依次排列。
作为32位的微处理器,ARM体系结构所支
持的最大寻址空间为4GB。
ARM体系结构可以用两种方法存储字数据,
称为大端格式和小端格式,具体说明如下。
◆ 大端格式:字数据的高字节存储在低
地址中,而字数据的低字节则存放在高
地址中。
8 9 10 11
4 5 6 7
0 1 2 3
31 2423 1615 8 7 0字地址
高地址
低地址
以大端格式存储字数据
◆◆ 小端格式:与大端存储格式相反,在小端存储小端格式:与大端存储格式相反,在小端存储
格式中,低地址中存放的是字数据的低字节,高格式中,低地址中存放的是字数据的低字节,高
地址存放的是字数据的高字节。地址存放的是字数据的高字节。
11109 8
7 6 5 4
3 2 1 0
以小端格式存储字数据
高地址
低地址
31 2423 1615 87 0字地址
8
4
0
理器模式
ARMARM微处理器支持微处理器支持77种运行模式,分别为:种运行模式,分别为:
用户模式用户模式(usr):ARM(usr):ARM处理器正常的程序执行状态。处理器正常的程序执行状态。
快速中断模式快速中断模式(fiq):(fiq):用于高速数据传输或通道处理。用于高速数据传输或通道处理。
外部中断模式(外部中断模式(irqirq):用于通用的中断处理。):用于通用的中断处理。
管理模式(管理模式(svcsvc):操作系统使用的保护模式,):操作系统使用的保护模式,系统复系统复
位后的缺省模式。位后的缺省模式。
.指令终止模式指令终止模式(abt):(abt):指令预取终止时进入该模式。指令预取终止时进入该模式。
.数据访问终止模式数据访问终止模式(abt)(abt):当数据访问终止时进入该:当数据访问终止时进入该
模式,可用于虚拟存储及存储保护。模式,可用于虚拟存储及存储保护。
指令未定义模式指令未定义模式(und):(und):支持硬件协处理器指令的软件支持硬件协处理器指令的软件
仿真仿真
系统模式系统模式(sys)(sys):运行具有特权的操作系统任务。:运行具有特权的操作系统任务。
ARM微处理器的运行模式可以通过软件改
变,也可以通过外部中断或异常处理改变。
大多数的应用程序运行在用户模式下,当处
理器运行在用户模式下时,某些被保护的系统资
源是不能被访问的。
除用户模式以外,其余的所有6种模式称为
非用户模式或特权模式(Privileged Modes);
其中除去用户模式和系统模式以外的5种又
称为异常模式(Exception Modes),常用于处理
中断或异常,以及需要访问受保护的系统资源等
情况。
处理器启动时的模式转换图
超级模式
(Supervisor) 多种特权模式变化 用户程序的运行模式
复位后的缺
省模式
主要完成各
模式的堆栈
设置,注意
不要进入用
户模式
一般为用户
模式
User
处理器模式
寄存器组织
如图 2-4 所示,ARM微处理器共有37个
32位寄存器,其中31个为通用寄存器,6个
为状态寄存器。但是这些寄存器不能被同
时访问,具体哪些寄存器是可编程访问的,
取决于微处理器的工作状态及具体的运行
模式。但在任何时候,通用寄存器R0~R14、
程序计数器PC、一个或两个状态寄存器都
是可访问的。
1. ARM状态下的寄存器组织
(1) 通用寄存器.
(2) 寄存器R16
(1) 通用寄存器.
通用寄存器包括R0~R15,可以分为3类:
未分组寄存器R0~R7
分组寄存器R8~R14
程序计数器PC(R15)
① 未分组寄存器R0~R7
在所有的运行模式下,未分组寄存器都指向
同一个物理寄存器,它们未被系统用作特殊的用
途,因此,在中断或异常处理进行运行模式转换
时,由于不同的处理器运行模式均使用相同的物
理寄存器,可能会造成寄存器中数据的破坏,这
一点在进行程序设计时应引起注意。
② 分组寄存器R8~R14
对于分组寄存器,它们每一次所访问的物
理寄存器与处理器当前的运行模式有关。
对于R8~R12,每个寄存器对应两个不同的
物理寄存器,当使用fiq模式时,访问寄存器
R8_fiq~R12_fiq;当使用除fiq模式以外的其他
模式时,访问寄存器R8_usr~R12_usr。
对于R13、R14,每个寄存器对应6个不同
的物理寄存器,其中一个是用户模式与系统模
式共用,另外5个物理寄存器对应于其他5种不
同的运行模式。
采用以下记号来区分不同的物理寄存器:
R13_<mode>
R14_<mode>
其中,mode为以下几种模式之一:usr、
fiq、irq、svc、abt、und。
寄存器R13在ARM指令中常用作堆栈指针,
但这只是一种习惯用法,用户也可使用其他的
寄存器作为堆栈指针。而在Thumb指令集中,
某些指令强制性的要求使用R13作为堆栈指针。
由于处理器的每种运行模式均有自己独
立的物理寄存器R13,在用户应用程序的初
始化部分,一般都要初始化每种模式下的
R13,使其指向该运行模式的栈空间.
这样,当程序的运行进入异常模式时,
可以将需要保护的寄存器放入R13所指向的
堆栈,而当程序从异常模式返回时,则从对
应的堆栈中恢复,采用这种方式可以保证异
常发生后程序的正常执行。
R14也称做子程序连接寄存器(Subroutine
Link Register)或连接寄存器LR。
当执行BL子程序调用指令时,R14中得到
R15(程序计数器PC)的备份。其他情况下,
R14用作通用寄存器。
与之类似,当发生中断或异常时,对应的
分组寄存器R14_svc、R14_irq、R14_fiq、
R14_abt和R14_und用来保存R15的返回
值。
寄存器R14常用于如下的情况:
在每一种运行模式下,都可用R14
保存子程序的返回地址,当用BL或BLX
指令调用子程序时,将PC的当前值复制
给R14,执行完子程序后,又将R14的
值复制回PC,即可完成子程序的调用返
回。
以上的描述可用指令完成:
执行以下任意一条指令:
MOV PC,LR 或 BX LR
在子程序入口处使用以下指令将R14存 入
堆栈:
STMFD SP! ,{<Regs>,LR}
对应的,使用以下指令可以完成子程序返回:
LDMFD SP! ,{<Regs>,PC}
R14也可作为通用寄存器。
③ 程序计数器PC(R15)
寄存器R15用作程序计数器(PC)。在
ARM状态下,位[1:0]为0,位[31:2]用于
保存PC;在Thumb状态下,位[0]为0,位
[31:1]用于保存PC。
虽然可以用作通用寄存器,但是有一些
指令在使用R15时有一些特殊限制,若不注
意,执行的结果将是不可预料的。
在ARM状态下,PC的0和1位是0,在
Thumb状态下,PC的0位是0。
R15虽然也可用作通用寄存器,但一般
不这么使用,因为对R15的使用有一些特殊
的限制,当违反了这些限制时,程序的执
行结果是未知的。
由于ARM体系结构采用多级流水线技术,
对于ARM指令集而言,PC总是指向当前指
令的下两条指令的地址,即PC的值为当前
指令的地址值加八个字节。
在ARM状态下,任一时刻可以访问以上
所讨论的16个通用寄存器和1~2个状态寄存
器。在非用户模式(特权模式) 下,则可访
问到特定模式分组寄存器,图2-4说明在每
一种运行模式下,哪一些寄存器是可以访
问的。
(2) 寄存器R16
寄存器R16用作CPSR(Current
Program Status Register,当前
程序状态寄存器),CPSR可在任
何运行模式下被访问,它包括条件
标志位、中断禁止位、当前处理器
模式标志位,以及其他一些相关的
控制和状态位。
每一种运行模式下又都有一个专用
的物理状态寄存器,称为SPSR (Saved
Program Status Register,备份的程序
状态寄存器),当异常发生时,SPSR用于保
存CPSR的当前值,从异常退出时则可由
SPSR来恢复CPSR。
由于用户模式和系统模式不属于异
常模式,它们没有SPSR,当在这两种模
式下访问SPSR时,结果是未知的。
程序状态字参见后面说明。
2. Thumb状态下的寄存器组织
Thumb状态下的寄存器集是ARM状态
下寄存器集的一个子集,程序可以直接访问8
个通用寄存器(R7~R0)、程序计数器(PC)、堆
栈指针(SP)、连接寄存器(LR)和CPSR。
同时,在每一种特权模式下都有一组SP、
LR和SPSR。
图2-4表明Thumb状态下的寄存器组织。
(1) Thumb状态下的寄存器组织与ARM状态下
的寄存器组织的关系
Thumb状态下和ARM状态下的R0~R7是相同
的
Thumb状态下和ARM状态下的CPSR和所有
的SPSR是相同的
Thumb状态下的SP对应于ARM状态下的R13
Thumb状态下的LR对应于ARM状态下的R14
Thumb状态下的程序计数器对应于ARM状态
下的R15
以上的对应关系如图2-5所示。
(2) 访问THUMB状态下的高位寄存器
(Hi-registers)
在Thumb状态下,高位寄存器R8~R15
并不是标准寄存器集的一部分,但可使用汇
编语言程序有限制地访问这些寄存器,将其
用作快速的暂存器.
使用带特殊变量的 MOV指令,数据可以
在低位寄存器和高位寄存器之间进行传送,高
位寄存器的值可以使用CMP和ADD指令进行
比较或加上低位寄存器中的值。
(3) 程序状态寄存器
ARM体系结构包含一个当前程序状态寄存
器(CPSR)和5个备份的程序状态寄存器 (SPSRs)。
备份的程序状态寄存器用来进行异常处理,
其功能包括:
保存ALU中的当前操作信息。
控制允许和禁止中断。
设置处理器的运行模式。
程序状态寄存器每一位的安排如图2-6所示.
① 条件码标志(Condition Code
Flags)
N、Z、C、V均为条件码标志位。它
们的内容可被算术或逻辑运算的结果所
改变,并且可以决定某条指令是否被执
行。
在ARM状态下,绝大多数的指令都是
有条件执行的。在Thumb状态下.仅有
分支指令是有条件执行的。条件码标志
各位的具体含义如表2-1所示。
② 控制位
PSR的低8位(包括I、F、T和M[4:0])称为控
制位,当发生异常时这些位可以被改变。如
果处理器运行特权模式,这些位也可以由程
序修改。
中断禁止位I、F
I=1 禁止IRQ中断
F=1 禁止FIQ中断
T标志位:该位反映处理器的运行状态。
对于ARM体系结构v5及以上版本的T
系列处理器,当该位为1时,程序运行于
Thumb状态,否则运行于ARM状态。
对于ARM体系结构v5及以上版本的非
T系列处理器,当该位为1时,执行下一条
指令以引起未定义的指令异常;当该位为0
时,表示运行于ARM状态。
运行模式位M[4:0]:M0、M1 、 M2、
M3、M4是模式位。这些位决定了处理器
的运行模式。具体含义如表2-2所示。
由表2-2可知,并不是所有的运行模
式位的组合都是有效的,其他的组合结
果会导致处理器进入一个不可恢复的状
态。
③ 保留位
PSR中的其余位为保留位,当改变
PSR中的条件码标志位或者控制位时,
保留位不要改变,在程序中也不要使用
保留位来存储数据。保留位将用于ARM
版本的扩展。
异常
异常(exception)由内部或外部源产生以引
起处理器处理一个事件。例如,外部中断或试图
执行未定义指令都会引起异常。在处理异常之前,
处理器状态必须保留,以便在异常处理程序完成
后,原来的程序能够重新执行。同一时刻可能出
现多个异常。
ARM支持7种类型的异常。表2-3列出了异
常的类型以及处理这些异常的处理器模式。异常
出现后,强制从异常类型对应的固定存储器地址
开始执行程序。这些固定的地址称为异常向量
(Exception Vectors)。
当异常出现时,异常模式分组的当异常出现时,异常模式分组的R14R14和和SPSRSPSR用于保存用于保存
状态,即状态,即
R14_<exception mode> = return linkR14_<exception mode> = return link
SPSR_<exception_mode> = CPSRSPSR_<exception_mode> = CPSR
CPSR[4:0] = exception mode numberCPSR[4:0] = exception mode number
CPSR[5]CPSR[5] = 0 = 0 //**在在ARMARM状态执行状态执行**//
if <exception mode> == Reset or FIQ if <exception mode> == Reset or FIQ
then CPSR[6] = 1 then CPSR[6] = 1 //**禁止快速中断禁止快速中断**//
//**否则否则CPSR[6]CPSR[6]不变不变**//
CPSR[7] = 1 CPSR[7] = 1 //**禁止正常中断禁止正常中断*/*/
PC = exception vector addressPC = exception vector address
当处理异常返回时,将当处理异常返回时,将SPSRSPSR传送到传送到CPSRCPSR,,R14R14传送传送
到到PCPC。这可用两种方法自动完成,即。这可用两种方法自动完成,即
使用带使用带SS位的数据处理指令,将位的数据处理指令,将PCPC作为目的寄存器;作为目的寄存器;
使用带恢复使用带恢复CPSRCPSR的多加载指令。的多加载指令。
1.复 位
处理器上一旦有复位输入,处理器上一旦有复位输入,ARMARM处理器立刻停止处理器立刻停止
执行当前指令。复位完成下列操作执行当前指令。复位完成下列操作
R14_svc=UNPREDICTABLE valueR14_svc=UNPREDICTABLE value
SPSR_svc=UNPREDICTABLE valueSPSR_svc=UNPREDICTABLE value
CPSR[4:0]=0b10011 /*CPSR[4:0]=0b10011 /*进入管理模式进入管理模式*/*/
CPSR[5]CPSR[5]==0 /*0 /*在在ARMARM状态下执行状态下执行*/*/
CPSR[6]CPSR[6]==1 /*1 /*禁止快速中断禁止快速中断*/*/
CPSR[7]CPSR[7]==1 /*1 /*禁止正常中断禁止正常中断*/*/
If high vectors configured thenIf high vectors configured then
PC=0xFFFF0000PC=0xFFFF0000
ElseElse
PC=0x00000000PC=0x00000000
复位后复位后,ARM,ARM处理器在禁止中断的管理模式下处理器在禁止中断的管理模式下,,从地从地
址址0x000000000x00000000或或OxFFFF0000OxFFFF0000开始执行指令。开始执行指令。
2.未定义指令异常
当ARM处理器执行协处理器指令时,它必须
等待任一外部协处理器应答后,才能真正执行这
条指令。若协处理器没有响应,就会出现未定义
指令异常。
若试图执行未定义的指令,也会出现未定义
指令异常。
未定义指令异常可用于没有物理协处理器(硬
件)的系统上,对协处理器进行软件仿真,或在软
件仿真时进行指令集扩展。
当未定义指令异常出现时,执行下列操作:
R14_und=address of next instruction after the R14_und=address of next instruction after the
undefined instructionundefined instruction
SPSR_und=CPSRSPSR_und=CPSR
CPSR[4:0]=0b11011 /*CPSR[4:0]=0b11011 /*进入未定义模式进入未定义模式*/*/
CPSR[5]=0 /*CPSR[5]=0 /*在在ARMARM状态执行状态执行*/*/
/*CPSR[6]/*CPSR[6]不变不变*/*/
CPSR[7]=1 /*CPSR[7]=1 /*禁止正常中断禁止正常中断*/*/
If high vectors configured thenIf high vectors configured then
PC=0xFFFF0004PC=0xFFFF0004
ElseElse
PC=0x00000004PC=0x00000004
在仿真未定义指令后,使用下列指令返回,即在仿真未定义指令后,使用下列指令返回,即
MOVS PCMOVS PC,,R14R14
上面的指令恢复上面的指令恢复PC(PC(从从R14_und)R14_und)和和CPSR(CPSR(从从
SPSR_und)SPSR_und),并返回到未定义指令后的下一条指令。,并返回到未定义指令后的下一条指令。
3.软件中断异常
软件中断指令软件中断指令SWI(SoftWare Interrupt SWI(SoftWare Interrupt
lnstruction)lnstruction)进入管理模式,以请求特定的管理进入管理模式,以请求特定的管理((操作系操作系
统统))函数。当执行函数。当执行SWISWI时,完成下列操作:时,完成下列操作:
R14_svc=address of next instruction after the R14_svc=address of next instruction after the
SWI instructionSWI instruction
SPSR_svc=CPSRSPSR_svc=CPSR
CPSR[4:0]=0b10011 /*CPSR[4:0]=0b10011 /*进入管理模式进入管理模式*/*/
CPSR[5]=0 /*CPSR[5]=0 /*在在ARMARM状态执行状态执行*/*/
/*CPSR[6]/*CPSR[6]不变不变*/*/
CPSR[7]=1 /*CPSR[7]=1 /*禁止正常中断禁止正常中断*/*/
If high vectors configured thenIf high vectors configured then
PC=0xFFFF0008PC=0xFFFF0008
ElesEles
PC=0x00000008PC=0x00000008
完成SWI操作后,使用下列指令
恢复PC(从R14_svc)和CPSR(从
SPSR_svc),并返回到SWI指令后
的下一条指令,即
MOVS PC,R14
4. 预取中止(取指令存储器中止)
存储器系统发出存储器中止(abort)信号。
响应取指激活的中止标记所取的指令无效。
若处理器试图执行无效指令,则产生预
取中止异常。
若指令未执行(例如,指令在流水线中发
生了转移),则不发生预取中止。在ARMv5
及以上版本中,执行BKPT指令也会产生预
取中止异常。
当试图执行一条中止的指令时,将执行
下列操作:
R14_abt=address of the aborted instruction + 4R14_abt=address of the aborted instruction + 4
SPSR_abt=CPSRSPSR_abt=CPSR
CPSR[4:0]=0b10111 /*CPSR[4:0]=0b10111 /*进入中止模式进入中止模式*/*/
CPSR[5]=0 /*CPSR[5]=0 /*在在ARMARM状态执行状态执行*/*/
/* CPSR [6]/* CPSR [6]不变不变*/*/
CPSR[7]=1 /*CPSR[7]=1 /*禁止正常中断禁止正常中断*/*/
If high vectors configured thenIf high vectors configured then
PC=0xFFFF000CPC=0xFFFF000C
Else Else
PC=0x0000000CPC=0x0000000C
确定中止原因后,使用下面指令从中止模式返回,即确定中止原因后,使用下面指令从中止模式返回,即
SUBS PCSUBS PC,,R14R14,,#4#4
上面的指令恢复上面的指令恢复PC(PC(从从R14_abt)R14_abt)和和CPSR(CPSR(从从
SPSR_abt)SPSR_abt),并返回到中止的指令。,并返回到中止的指令。
5.数据中止(数据访问存储器中止
)
存储器系统发出存储器中止信号。响应数据
访问(加载或存储)激活的中止标记数据为无效。
在下面的任何指令或异常改变CPU状态之前,数
据中止异常发生。执行下列操作:
R14_abt=address of the aborted instruction + 8R14_abt=address of the aborted instruction + 8
SPSR_abt=CPSR
CPSR[4:0]=0b10111 /*进入中止模式*/
CPSR[5]=0 /*在ARM状态执行*/
/* CPSR [6]不变*/
CPSR[7]=1 /*禁止正常中断*/
If high vectors configured then
PC=0xFFFF0010
Else
PC=0x00000010
确定中止原因后,使用下列指令从中止模式
返回,即
SUBS PC,R14,#8
上面的指令恢复PC(从R14_abt)和CPSR
(从SPSR_abt),并返回重新执行中止的指令。
若中止的指令不需要重新执行,则使用下面的
指令:
SUBS PC,R14,#4
6. 中断请求(IRQ)异常
通过处理器上的IRQ输入引脚,由外
部产生IRQ异常。IRQ异常的优先级比
FIQ异常的低。当进入FIQ处理时,会屏
蔽掉IRQ异常。
若CPSR的I位置为1,则禁止IRQ中断。
若I位清零,则ARM在指令执行完之前检
查IRQ输入。
只能在特权模式下改变I位,当检测到
IRQ时,执行下列操作:
R14_irq=address of the aborted instruction + 4R14_irq=address of the aborted instruction + 4
SPSR_irq=CPSRSPSR_irq=CPSR
CPSR[4:0]=0b10010 /*CPSR[4:0]=0b10010 /*进入进入IRQIRQ模式模式*/*/
CPSR[5]=0 /*CPSR[5]=0 /*在在ARMARM状态执行状态执行*/*/
/* CPSR [6]/* CPSR [6]不变不变*/*/
CPSR[7]=1 /*CPSR[7]=1 /*禁止正常中断禁止正常中断*/*/
If high vectors configured thenIf high vectors configured then
PC=0xFFFF0018PC=0xFFFF0018
Else Else
PC=0x00000018PC=0x00000018
使用下面的指令从中断服务返回,即使用下面的指令从中断服务返回,即
SUBS PCSUBS PC,,R14R14,,#4#4
上面的指令恢复上面的指令恢复PC(PC(从从R14_irq)R14_irq)和和CPSR(CPSR(从从
SPSR_irq)SPSR_irq),并继续执行被中断的程序。,并继续执行被中断的程序。
7.快速中断请求(FIQ)异常
通过处理器上的FIQ输入引脚,由外部产
生FIQ异常。FIQ被设计成支持数据传送和通
道处理,并有足够的私有(private)寄存器,
从而在这样的应用中可避免对寄存器保存的
需求,减少了上下文切换的总开销。
当CPSR的F位置1时,禁止快速中断。
若F位清零,则ARM在执行指令时检查FIQ输
入。只能在特权模式下改变F位,当检测到
FIQ时,执行下列操作,即
R14_fiq=address of the aborted
instruction + 4
SPSR_fiq=CPSR
CPSR[4:0]=0b10001 /*进入FIQ模式*/
CPSR[5]=0 /*在ARM状态执行*/
CPSR[6]=1 /*禁止快速中断*/
CPSR[7]=1 /*禁止正常中断*/
If high vectors configured then
PC=0xFFFF001C
Else
PC=0x0000001C
使用下面的指令从中断服务返回,
即
SUBS PC,R14,#4
上面的指令恢复PC(从R14_fiq)和
CPSR(从SPSR_fiq),并继续执行被中
断的程序。FIQ向量放在最后,允许FIQ
异常处理程序直接放在地址
0x0000001C或0xFFFF001C开始的位
置,而不需要由向量的分支指令执行跳
转到异常处理程序。
8. 异常优先级
异常的优先级如表2-4所列。
优优先先级级 异常异常 优优先先级级 异常异常
11(最高)(最高) 复复位位 44 IRQIRQ
22 数据中止数据中止 55 预预取中止取中止
33 FIQFIQ 66(最低)(最低) 未定未定义义指信、指信、SWISWI
9. 高端向量
一些ARM实现允许异常向量的定位
由32位地址空间低端的正常地址范围
Ox00000000~Ox000000lC,移到接近
于地址空间高端的另一地址范围
0xFFFF0000~0xFFFF00lC。
这些改变后的地址位置称为高端向
量。由IMPLEMENTATION DEFINED
决定是否支持高端向量。如果支持,则
在输入硬件配置时,选择是使用正常向
量还是高端向量。
10. 异常的进入和退出
只要正常的程序流程被暂时停止,
则异常发生,例如服务外部的中断。
在异常被处理之前,必须保存当
前的处理器状态,以便当处理程序完
成后,原来的程序能重新开始。
如果几种异常同时发生,则对它
们按固定的次序处理,可参考异常优
先级
(1) 进入异常的操作
处理一个异常时,ARM7TDMI用于:
①将下一条指令的地址保存在相应的
LR寄存器中。
如果异常是从ARM状态进入,则保存
在LR寄存器中的是下一条指令的地址(当
前PC+4或PC+8,取决于异常,见表2-5)。
如果异常是从Thumb状态进入,则
保存在LR寄存器中的是当前PC的偏移
值。它能使程序在异常处理返回后从正
确的位置重新开始。
这就意味异常处不需要确定异常是
从何种状态进入的。例如在软件中断
(SWI)情况下,“MOVS PC,R14_svc”,
总是返回到下一条指令,而与SWI是在
ARM还是Thumb状态下执行的无关。
②将CPSR复制到相应的SPSR中。
③迫使CPSR模式位设置成取决于异
常的值。
④迫使PC从相关的异常向量中取下
一条指令。也可以设置中断禁止位
来阻止其它无法处理的异常嵌套。
如果在异常发生时处理器是在
Thumb状态下,那么当用中断异常
向量地址加载PC时,自动切换进入
ARM状态。
(2) 退出异常的操作
在完成异常处理后:
1. 将LR寄存器的值减去相应的偏移量
(偏移量根据异常不同而不同),送到PC中;
2. 将SPSR复制回CPSR中;
3. 清除中断禁止位标志。
另外,不需要显式切换回Thumb状态,
因为从SPSR中将CPSR T位自动设置为异
常前的原值。
(3) 进入和退出异常小结
表2-5中总结了进入异常处理时保
存在相应的R14寄存器中的PC值,
以及在退出异常处理时推荐使用的
指令。
1. PC是具有预取中止的BL/SWI/未定义指
令所取的地址;
2. PC是从FIQ或IRQ取得优先权后不能执
行的指令的地址;
3. PC是产生数据中止的加载或存储指令
的地址;
4. 复位时保存在R14_svc中的值是不可预
知的。