版权声明:本文为博主原创文章,未经博主允许不得转载。 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 的值:
|
V | 可以有两种方法设置 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=
- V= (两个进位进行亦或)
更多解释:
C 用来判断无符号数计算是否溢出。
V 用来判断有符号数计算是否溢出 。
具体看哪个根据你计算时把数据当成有符号位还是无符号位。
控制位代表啥含义不是我撰写的本文重点,故此不提。