程序状态寄存器(ARM处理器架构模型——寄存器组织,下篇)
本文声明:内容来源于网络,进行整合/再创作;部分内容由AI辅助生成。
在AArch32执行状态下,使用当前程序状态寄存器(Current Program Status Register,CPSR)记录当前处理单元PE的运行状态数据,可以在任何处理器运行模式下被访问(读/写),它包含下列内容:
- ALU(Arithmetic Logic Unit,算术逻辑单元)状态标志的备份(4个条件码的标志)
- 2个中断使能标志
- 处理器的工作状态(ARM/Thumb态)
- 当前的处理器运行模式
ARM微处理器的每种异常模式(即除USR、SYS模式外的运行模式)下,都有一个专用的物理寄存器作为保存程序状态寄存器(Saved Program Status Register,SPSR)。当特定的异常发生后,CPU进行异常处理过程时,这个物理寄存器负责存放CPSR的内容。当异常处理程序返回时,再将其内容恢复到CPSR。
AArch32执行状态下CPSR(和保存它的SPSR)中的每一位的功能如下图所示。
(条件码)标志位
N(Negative)、Z(Zero)、C(Carry)、V(Overflow)通称为条件码标志位。它们会根据程序中的算术/逻辑指令的执行结果进行修改。所有ARM指令可以根据这些条件码标志,选择性地执行后续指令(条件执行),而Thumb指令中只有分支指令可按条件执行。
然而,AArch64对条件执行的设计与传统ARM32位架构、Thumb 指令集存在显著差异:其核心变化是彻底取消了除分支指令外所有指令的条件执行能力,仅保留分支指令(如 B/BL/CBZ/BNZ 等)基于PSTATE的N/Z/C/V标志位的条件执行功能。为了弥补非分支指令条件执行缺失带来的功能缺口,AArch64专门引入了以条件选择指令(CSEL)为核心的一系列专用条件操作指令,以及简化的条件分支指令等新机制,以此实现等效的条件逻辑处理。

N(Negative result from ALU)【负数(补码1)标志位】
此位设置成当前指令执行结果的bit[31]的值。当两个由补码表示的有符号整数运算时,N=1表示运算的结果为负数,N=0表示结果为正数或零。
Z(Zero result from ALU)【结果为零标志位】
Z=1表示运算的结果为零,Z=0表示运算的结果不为零。
C(ALU operation Carried out or borrow)【进/借位标志位】
有4种关于C标志位的设置方法
①在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出;其他情况下C=0。
②在减法指令中(包括比较指令CMP),当运算中发生借位(即无符号数运算发生下溢出),则C=0;其他情况下C=1。
③对于在操作数中包含移位操作的运算指令(非加/减法指令),C被设置成被移位寄存器最后移出去的位(指令总是以小端方式存储,因此是从最高位最后移出的值)。
④对于其他非加/减法运算指令,C的值通常不受影响。
V(ALU operation Overflowed)【符号位溢出标志位】
有2种关于V标志位的设置方法
①对于加/减运算指令,当操作数和运算结果都是以二进制的补码表示有符号数,且运算结果超出了运算范围时是溢出。V=1表示符号位溢出。
②对于非加/减法指令,通常不改变标志位V的值(具体可参照ARM指令手册)。
尽管以上C和V的定义看起来颇为复杂,但使用时在大多数情况下用一个简单的条件测试指令即可(直接判断运算结果的特征,如是否相等、是否大于、有无溢出等),不需要计算出条件码的精确值即可得到需要的结果。
Q
在带DSP指令扩展的ARMv5及更高版本的E系列处理器中,bit[27]被指定用于指示增强的DSP运算指令是否发生了溢出,因此也就被称为Q标志位。同样,在SPSR中bit[27]也被称为Q标志位,用于在异常发生时保存和恢复CPSR中的Q标志位。
注意,在在其他版本处理器中,Q标志位没有被定义,属于待扩展的位。
控制位
CPSR的低8位(I、F、T、M[4]及M[3:0])统称为控制位。当异常发生时,这些位的值将发生相应的变化。另外,如果在特权模式下,也可以通过软件编程来修改这些位的值。
中断禁止位(I、F)
I=1,IRQ被禁止。F=1,FIQ被禁止。
处理器工作状态控制位(T)
- T=0,处理器处于ARM状态(即正在执行字对齐的32位ARM指令)。PC的值由bits [31:2]决定, bits [1:0] 未定义 (所以指令不能halfword / byte对齐)
- T=1,处理器处于Thumb状态(即正在执行半字对齐的16位Thumb指令)PC的值由bits [31:1]决定, bits [0] 未定义 (所以指令不能byte对齐).
注意,T位只有在T系列的ARM处理器上才有效,在非T系列的ARM版本中,T位将始终为0。
寄存器组织控制位(M[4])
M[4]=1时,使用AArch32寄存器组织。
内核工作模式控制位
M[3:0]作为处理器运行模式控制位,这些位的组合确定了处理器处于哪种内核工作模式。如下表所示列出了其具体含义。注意,只有下表中列出的组合是有效的,其他组合无效。
|
M[3∶0] |
处理器模式 |
|
0b0000 |
User |
|
0b0001 |
FIQ |
|
0b0010 |
IRQ |
|
0b0011 |
Supervisor |
|
0b0110 |
MON |
|
0b0111 |
Abort |
|
0b1010 |
Hyp |
|
0b1011 |
Undefined |
|
0b1111 |
System |
IF-THEN(IT指令块)标志位
CPSR中的bits[15:10,26:25]称为IF-THEN标志位,它用于对Thumb指令集中IF-THEN-ELSE这一类语句块的控制。其中IT[4:0]定义为IF-THEN语句块的长度;IT[7:5]定义为基本条件,具体如下图所示。

A位、E位和GE[19-16]位
A表示异步异常禁止位。
E表示大小端控制位,0表示小端操作,1表示大端操作。注意,该位在预取阶段是被忽略的。
GE[19-16]用于表示在SIMD指令集中的大于、等于标志。任何模式下该位可读、可写。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)