Cortex --寄存器组

前言

还是和ARM7做对比进行学习

寄存器的总体区别

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

用户模式系统模式管理模式中止模式为定义模式IRQ模式FIQ模式cortex
R0R0R0R0R0R0R0R0
R1R1R1R1R1R1R1R1
R2R2R2R2R2R2R2R2
R7R7R7R7R7R7R7R7
R8R8R8R8R8R8R8_FIQR8
…_FIQ
R12R12R12R12R12R12R12_FIQR12
R13(SP)R13R13_SVCR13_ABTR13_UNDR13_IRQR13_FIQR13
R14 (LR)R14R14_SVCR14_ABTR14_UNDR14_IRQR14_FIQR14
R15(PC)PCPCPCPCPCPCPC
CPSRCPSRCPSRCPSRCPSRCPSRCPSRxPSR
SPSR_SVCSPSR_ABTSPSR_UNDSPSR_IRQSPSR_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]是控制域用于控制中断的模式。

313029282726-252423 1615-87654-0
NZCVQunusedJunusedunusedIFTMODE

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

313029282726-252423 -1615-1098-0
NZCVQICI/ITTunusedICI/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 模式永远都是特权级的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工农村贴膜小哥

我倒是要看看是那个憨憨在给我打

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值