本文声明:内容来源于网络,进行整合/再创作;部分内容由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)中的每一位的功能如下图所示。

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指令集中的大于、等于标志。任何模式下该位可读、可写。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐