ARM1176JZF-S 8种操作模式
在ARM1176JZF-S体系结构中有8种操作模式
用户模式(User mode):大多数的应用程序运行在这个模式
系统模式(system mode):操作系统的特权用户模式
管理者模式(supervisor 模式):用于操作系统保护模式
快速中断模式(FIQ)模式:用于处理快速中断时候的模式
中断模式(IRQ)模式:用户处理普通中断时候的模式
终止模式(Abort mode):在数据终止或者预取终止的时候进入这个模式
未定义模式(undefined mode):在未定义指令异常发生的时候进入这个模式
安全监视模式(secure Monitor模式):运行TrustZone安全监测代码的安全模式
除了用户模式以外的其他模式都是特权模式用于中断或者异常或者访问保护的资源。除了用户模式和系统模式外的其余模式属于异常模式。
ARM模式下的寄存器
ARM1176JZF-S共有40个32位寄存器
其中有33个通用寄存器
7个状态寄存器
其中R0-R12用于作为通用寄存器使用,用于存储数据或者数据的地址。R13,R14,R15有特殊用途
一般
R13用于作为堆栈指针
R14用于作为子函数的访问地址保存寄存器
R15用于作为程序计数器
在ARM状态这个是字对齐的
在Thumb状态这个是半字对齐的
在Jazelle状态这个是字节对齐的
CPSR是记录当前指令状态的寄存器
SPSR用于在程序进入中断前对CPSR进行备份的,它的结构和CPSR的结构是一样的。
在下面这张图中是ARM状态下的寄存器图(下面还会介绍Thumb状态下的寄存器)
其中R0-R7 ,R15这9个是各种模式公用的(9个)
在FIQ中的R8-R14是独立出来的,这样做是为了在快速中断的时候不要保护这些寄存器,可以加快切换的速度(这里7个了)
R8-R12这5个除了FIQ独立出来外其他都是公用的这里有5个
R13,R14这两个有六组共12个,在异常模式下各个模式拥有私有的堆栈和连接寄存器。
状态寄存器各种模式共享一个
备份状态寄存器6个异常模式各有一个(共6个)
上面就是40个寄存器的由来
下面这个是各个模式的缩写:其中用户模式一般省略不写,只有其他模式下指定访问用户或者系统寄存器的时候才标注出来
Thumb 状态下的寄存器
上图是Thumb状态下的寄存器,和ARM状态下的寄存器比少的是R8-R12这些寄存器。
状态寄存器 CPSR SPSR
状态寄存器CPSR 和SPSR的结构是一样的。只不过SPSR是用于异常模式下备份CPSR的。这个寄存器有三个部分
(1)最近ALU运行的状态
N:如果结果是负数的话这个位为1
Z:如果结果是零的话这个位为1
C:在加法指令或者CMN中,当结果产生进位的时候为1
在减法指令或者CMP中,当结果产生借位的时候为0
在移位操作中非加减运算指令,C包含最后一次溢出的位的数值
V:在有符号数的加减运算中如果存在符号位溢出,这个位被置为1
Q:用于表示增强型的DSP指令是否发生了溢出。这个位可以被一些乘法指令或者小数指令,在被指令置为1的时候要等到使用MSR指令来写CPSR的时候才清除。指令不能以Q位为条件来执行。如果要确定Q位的状态可以将PSR读入寄存器中来提取信息。
(2)中断的使能和禁止
I=1的时候IRQ中断禁止
F=1的时候FIQ中断禁止
A是自动设置的,用于禁止不精确的数据中断。
(3)处理器模式的控制
J:J=0表示处理器在ARM或者Thumb状态,具体取决于T位
J=1 表示处理器在Jazelle状态
当J=1,T=1的时候下一个指令会进入未定义指令异常,进入这个异常会导致处理器再次进入ARM状态,在未定义指令异常中可 以通过查看SPSR_und中的T和J位检测到这个错误。
MSR不能用来修改J位
T =1表示运行在Thumb状态
T=0表示处理器运行在ARM或者Jazelle状态
不要使用MSR来强制修改T位,在ARM1176JZF-S处理器中这个操作没有影响。
E用于控制载入和存储的大小端,ARM和Thumb提供了专门的指令来置位和清除这个位
M[4-0]用于切换状态
在这些寄存器中可以分成3类:NZCVQ GE[3...0] E这几位可以在任何模式下通过MSR或者通过能够写特定或者整个CPSR寄存器的指令来修改
J T 这两位不能通过MSR或者其他特定指令来修改
A I F 和M[4..0]只能在特权模式下才能修改,用户模式不能修改,用户要修改必须进入特权模式
对于保留位在我们修改其他标志位的时候不要修改这些位,同时我们的程序也不要依靠于这些位,因为这些位以后可能会被用到。