Cortex --寄存器组

前言

还是和ARM7做对比进行学习

寄存器的总体区别

由于arm7有七种工作模式,而cortex只有两种,所以在寄存器方面有很大的区别。

用户模式 系统模式 管理模式 中止模式 为定义模式 IRQ模式 FIQ模式 cortex
R0 R0 R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2 R2 R2
R7 R7 R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8 R8_FIQ R8
…_FIQ
R12 R12 R12 R12 R12 R12 R12_FIQ R12
R13(SP) R13 R13_SVC R13_ABT R13_UND R13_IRQ R13_FIQ R13
R14 (LR) R14 R14_SVC R14_ABT R14_UND R14_IRQ R14_FIQ R14
R15(PC) PC PC PC PC PC PC PC
CPSR CPSR CPSR CPSR CPSR CPSR CPSR xPSR
SPSR_SVC SPSR_ABT SPSR_UND SPSR_IRQ SPSR_FIQ
PRIMASK
FAULTMASK
BASEPRI
CONTROL

在arm7中,R0–R7的通用寄存器所有模式共用,而R8–R12寄存器中,快中断模式有自己独立的寄存器,可以快速处理中断,而其他模式还是共用寄存器。SP和LR中用户模式和系统模式共用寄存器,其他模式有独立寄存器,每个异常模式有自己的SPSR用于保存之前的cpsr,中断处理后进行返回。

M3就没有这么繁琐的寄存器,它有R0–R15的通用寄存器,也有CPSR,不过换了个名字xPSR。同时新增了用于控制异常的使能和失能寄存器PRIMASK, FAULTMASK 和 BASEPRI。以及用于定义特权级别,还用于选择当前使用哪个堆栈指针的控制寄存器CONTROL

程序状态寄存器

在arm7时代的程序状态寄存器是这样的。将整个寄存器划分为4个域,[31-24]是标志域,用于判断计算是否溢出进位为0等。[23-16]是状态域没有使用,[15-8]是扩展域没有使用,[7-0]是控制域用于控制中断的模式。

31 30 29 28 27 26-25 24 23 16 15-8 7 6 5 4-0
N Z C V Q unused J unused unused I F T MODE

cortex的程序状态寄存器xpsr,将整个寄存器分为三个子状态寄存器(部分位没有使用):
应用程序 PSR(APSR)—对应cpsr标志域[31-27],(由8位减到5位)
执行 PSR(EPSR)—对应cpsr没有使用的状态域和扩展域
中断号 PSR(IPSR)—对应cpsr的控制域[8-0](增加了1位)

31 30 29 28 27 26-25 24 23 -16 15-10 9 8-0
N Z C V Q ICI/IT T unused ICI/IT 中断号

在这里插入图片描述

APSR

N:表示两个有符号整数运算时,N==1表示运算结果为负数,N=0表示运算结果为正数或者零。
Z:Z=1表示运算结果为0,Z=0表示运算结果不为0
C:无符号加法运算产生进位,则C=1,无符号减法运算产生溢出,则C=0;
V:有符号加减运算产生溢出,则V=1;
Q:饱和条件码标志位

IPSR

在arm7中,是通过一个特定的数来表示某个模式,而cortex中,只有两个模式,所以当IPSR等于0时候,处于线程模式时,在手柄模式下,为当前异常的异常号。

EPSR

用来说明是arm指令还是thumb指令,其实也就是控制域的[5]位
T:Thumb状态, T=1,ARM状态,T=0;

通用状态寄存器

由R0到R12寄存器构成,其中R0到R7是低组寄存器。所有指令都能访问它们,复位后的初始值是不可预料的。R8-R12 被称为高组寄存器。这是因为只有很少的 16 位 Thumb 指令能访问它们, thumb-2 指令则不受限制。复位后的初始值也是不可预料的。

中间结果保存寄存器R12

R12一般用在子程序连接代码中使用,作为子程序的中间结果寄存器

堆栈指针寄存器R13(sp)

在 CM3 中有两个堆栈指针,当引用 R13(时,引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问( MRS,MSR指令)。
主堆栈指针(MSP),或写作 SP_main。这是缺省的堆栈指针,它由 OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。
进程堆栈指针(PSP),或写作 SP_process。用于常规的应用程序代码(不处于异常服用例程中时)。

连接寄存器R14(LR)

当通过BL跳转到子程序时,R14就被设置成子程序的返回地址,在子程序中把LR的值赋值给pc就可以实现子程序的返回。如 MOV PC,LR 或者 BX LR;

程序计数器R15(PC)

CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。

异常/中断屏蔽寄存器组

该寄存器组总共有3个寄存器,只有在特权级下,才允许访问这 3 个寄存器。
使用MRS/MSR指令访问这三个寄存器,比如:
MRS R0, BASEPRI ;读取BASEPRI到R0中
MSR BASEPRI, R0 ;将R0数据写入到BASEPRI中

PRIMASK寄存器

只有单一比特的寄存器。置为1后,就关掉所有可屏蔽异常,只剩下NMI和硬Fault的异常可以响应。默认值是0,表示没有关闭中断。

FAULTMASK寄存器

只有单一比特的寄存器。置为1后,只有NMI异常可以响应。默认值为0,表示没有关异常。

BASEPRI寄存器

该寄存器最多有9位(由表达优先级的位数决定)。定义了被屏蔽优先级的阈值。当它被设置为某个值后,所有优先级号大于等于此值的中断都被关。若设置成0,则不关断任何中断,0为默认值。

控制寄存器(Control)

CONTROL[1]:
为0表示选择MSP(主堆栈指针,默认情况),为1表示选择PSP(进程堆栈指针);
当为Handle模式下不允许向该位写1,也就是在Handle模式下。改为一直为0;仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。
CONTROL[0]:
为0表示特权级的线程模式,为1表示用户级的线程模式,Handler 模式永远都是特权级的;

猜你喜欢

转载自blog.csdn.net/qq_35651984/article/details/85729574
今日推荐