程序状态寄存器的作用就是反映处理器的状态信息。在程序运行期间我们可以通过查看程序状态寄存器的状态位来进行程序的分支跳转处理,或者我们可以设置程序状态寄存器的模式位来改变处理器的运行模式,或者我们可以设置程序状态寄存器的中断屏蔽位来屏蔽中断。
在任何时刻,我们可以访问处理器的16个寄存器(r0~r15)和当前程序状态寄存器(current program status register,cpsr)。用户模式下的程序访问的程序状态寄存器叫做apsr(application program status register),apsr是cpsr在用户模式下的别名,因为在用户模式下cpsr的部分域是不能操作的,因此cpsr的部分域被屏蔽后就是apsr。
cpsr寄存器组成
在所有模式下均可以访问到cpsr,只是在用户模式下cpsr的部分域是不能操作的,当前程序状态寄存器(cpsr)的位组成如下图所示:
snipaste_2023-09-08_20-34-48
各个位域的说明如下:
位 标志 说明
31 n 当运算结果为负且运算指令要求更新寄存器时,该位会被置位。
30 z 当运算结果为0且运算指令要求更新寄存器时,该位会被置位。
29 c 当运算结果产生进位且指令要求更新寄存器时,该位会被置位。
28 v 当运算结果产生符号位溢出且指令要求更新寄存器时,该位会被置位。
27 q cumulative saturation。
26:25 it[1:0] it位,由it[7:2]和it[1:0]组成,thumb指令集中it指令的if-then执行状态。
24 j 指示arm是否处于jazelle状态。
19:16 ge[3:0] 被一些simd(single instruction multiple data)指令使用。
15:10 it[7:2] 见it[1:0]的描述。
9 e 指示处理器的大小端模式,同时可以通过设置该位来修改处理器的大小端模式,1表示大端模式,0表示小端模式。
8 a 是否屏蔽异步终止,该位为1时表示屏蔽异步终止,为0时表示打开异步终止。
7 i 是否屏蔽irq,该位为1时表示屏蔽irq,为0时表示打开irq。
6 f 是否屏蔽fiq,该位为1时表示屏蔽fiq,为0时表示打开fiq。
5 t 指示arm是否处于thumb状态。j和t标志共同决定处理器使用的指令集。j=0,t=0:arm指令集;j=0,t=1:thumb指令集;j=1,t=0:jazelle指令集;j=1,t=1:thumbee指令集。
4:0 m[4:0] 指示处理器的模式,同时可以通过设置该位域来修改处理器的模式。
处理器各个模式的编码如下图所示:
snipaste_2023-09-01_20-59-03
apsr寄存器组成
在用户模式下,用户程序能够操作的cpsr寄存器位域是有限制的,对cpsr寄存器的部分位域屏蔽之后就是apsr了,应用程序状态寄存器(apsr)的位组成如下图所示:
snipaste_2023-09-11_20-03-04
从上图可以看出,apsr只能访问n,z,c,v,q和ge[3:0]这些标志位,这些标志位的含义和cpsr中对应标志位的含义一样。
spsr
备份程序状态寄存器(saved program status register,spsr)主要用于存储前一个执行模式的cpsr。fiq、irq、abt、svc和und模式,都有他们自己模式下专用的spsr。在处理器发生中断或者异常时,处理器会自动的从一个模式a进入到另一个模式b,模式a的cpsr/apsr将会自动保存到模式b的spsr中,这样模式b中的处理程序能够通过访问spsr寄存器得到模式a下cpsr寄存器的信息。
程序状态寄存器操作指令
cps指令
可以通过cps(change processor state)指令来修改处理器模式。cps指令也可以用来使能或者禁止异常。
cps指令的语法如下所示:
cps #modecpsie iflags{, #mode}cpsid iflags{, #mode}
mode是处理器的模式编码,比如在从其他模式下切换到sys模式,使用下述代码即可:
# 切换到sys模式cps #0x1f
ie使能中断或者终止。
id禁止中断或者终止。
iflags由下面的一种或者几种组成:
a:表示异步终止(asynchronous abort);
i:表示中断(irq);
f:表示快中断(fiq);
下述代码是cps指令的一些简单用法:
# 使能中断cpsie i# 禁止中断cpsid i# 使能异步终止和快中断cpsie af# 禁止异步终止和快中断cpsid af# 使能中断并切换到sys模式cpsie i, #0x1f
mrs与msr指令
mrs和msr指令可用于读写程序状态寄存器cpsr,apsr和spsr。
在arm处理器中,只有mrs指令可以从程序状态寄存器cpsr,apsr和spsr中读出数据到通用寄存器中。mrs指令操作程序状态寄存器的语法如下:
mrs{cond} rd, psr
cond为条件码。
rd为目标寄存器,rd不允许为r15。
psr为程序状态寄存器cpsr,apsr或者spsr。
mrs指令的示例代码如下所示:
# 将cpsr寄存器的值读取到r0中mrs r0, cpsr# 将spsr寄存器的值读取到r1中mrs r1, spsr# 将apsr寄存器的值读取到r2中mrs r2, apsr
msr指令可以用来写程序状态寄存器cpsr,apsr和spsr的全部或者部分域。msr指令操作程序状态寄存器的语法如下:
msr{cond} psr, #constantmsr{cond} psr, rmmsr{cond} psr_fields, #constantmsr{cond} psr_fields, rm
cond为条件码。
psr为程序状态寄存器cpsr或者spsr。
constant是一个8位立即数。arm文档对于constant的介绍如下:
constant is an 8-bit pattern rotated by an even number of bits within a 32-bit word. (not available in thumb.)
rm是源寄存器。
fields由下面的一个或者多个组合而成:
c:xpsr[7:0],控制位域;
x:xpsr[15:8],扩展位域;
s:xpsr[23:16],状态位域;
f:xpsr[31:24],标志位域;
msr指令的示例代码如下所示:
# 切换到sys模式mrs r0, cpsrorr r0, r0, #0x1fmsr cpsr, r0# 切换到sys模式msr cpsr_c, #0xdf
只有在除用户模式外的其他模式下才能够修改状态寄存器。
用自己的数据集训练YOLOv8实例分割模型
RSU路侧单元的防雷设计方案将实现多种互联汽车应用
10 BASE 以太网与CAN-XL有哪些不同点呢?
朗科P500京东JOY联名存储卡:手机扩容的首选
晨星5月营收掉5% 触控IC出货已逾200万颗/月
CPSR寄存器和APSR寄存器的组成
韩国将颁布新规:手机爆炸事故必须及时上报
智能制造技术可以为生产线带来什么
AGV在仓储物流领域发展受阻,工业类应用潜力更大
网关小电脑T8-PRO是个什么鬼
展会面面观,穿越时空提前看第88届中国电子展
浅谈空调对接端子问题
简单的稳压器为高端电流监视器提供恒定电压
聚飞光电、洲明科技和华灿光电实现营收净利双增长
启明信息为企业提供平台+资源+运营一体化数智采购服务
好看又好用的石墨烯移动地暖 今年冬天的取暖神器
双联开关接线图
加密货币BTC的市场份额下滑趋势分析
基于MPC860的HDLC通道驱动程序的设计与实现
晶华微电子推出数字温度传感器芯片SD5020和SD5003