ARM 程序状态寄存器深入分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_41104353/article/details/83065827

程序状态寄存器共分为两种,它们的位数都是 32 位:

  • 1 个 CPSR:当前程序状态寄存器(current program status register),可以在任何工作模式下被访问。
  • 5 个 SPSR:保持程序状态寄存器(saved program status register),只有在异常模式下,才能被访问;各异常模式拥有自己的 SPSR。发生异常时,SPSR 保存 CPSR 的值,格式同 CPSR。

它们 32 位的含义分别如下:

  • 条件码标志( The condition code flags):5 个。N 符号标志,Z 零标志,C 进位标志,V 溢出标志,Q DSP运算溢出标志。
  • 控制位(The control bits):4个。I IRQ标志,F FIQ标志,T 状态位,M[4:0] 模式位。
    图中的 DNM 是 Do Not Modify,表示不同版本、处理器的含义不同。
    在这里插入图片描述
    此图来自 https://blog.csdn.net/u014132720/article/details/52088485。不知道他看的哪本英文书,我看的没他这个详细,因此拿来一用。

条件码的具体含义:

标志位 含义
N 当用两个补码表示的带符号数进行运算时。
N=1:运算结果为负数 。
N=0:运算结果为正数或零
Z Z=1:运算结果为0。
Z=0:运算结果不为0
C 可以有四种方法设置 C 的值:
  • 加法运算(包括比较指令 CNM):C=1:运算结果产生了进位时(无符号数溢出)。C=0:运算结果没有进位
  • 减法运算(包括比较指令 CMP):C=0:运算时产生了借位(无符号数溢出)。C=1:没有借位
  • 对于包含移位操作的非加 / 减法运算指令,C 为移出值的最后一位
  • 对于其他的非加 / 减法 运算指令,C 的值通常不变
V 可以有两种方法设置 V 的值:
  • 对于加 / 减法运算指令,当操作数和运算结果为二进制的补码表示的有符号数时,V=1 表示符号位溢出
  • 对于其他的非加 / 减法 运算指令,V 的值通常不改变
Q 在 ARM v5 及以上版本的 E 系列处理器中,用 Q 标志位指示增强的 DSP 运算指令是否发生了溢出。在其它版本的处理器中,Q 标志位无定义。

至于这些值都是怎么得来的呢?看下面的讲解:

在这里插入图片描述
首先我们有上面这幅图,其中 D7-D0 代表数据位,共一个字节。其上的 C7-C0 则代表向前进位的值。

因此我们可以用 D7-D0 和 C7-C0 来表示条件码 N, Z, C, V:

  • N=D7
  • C=C7
  • Z= D 7 D 6... D 1 D 0 \overline{D7\lor D6...D1\lor D0}
  • V= C 6 C 7 C6\oplus C7 (两个进位进行亦或)

更多解释:
C 用来判断无符号数计算是否溢出。
V 用来判断有符号数计算是否溢出 。
具体看哪个根据你计算时把数据当成有符号位还是无符号位。

控制位代表啥含义不是我撰写的本文重点,故此不提。

猜你喜欢

转载自blog.csdn.net/sinat_41104353/article/details/83065827