一个版本:
31 | 30 | 29 | 28 | 27 | 26~25 | 24 | 23~20 | 19~16 | 15~10 | 9 | 8 | 7 | 6 | 5 | 4~0 |
---|
N | Z | C | V | Q | Res | J | Reserved | GE[3:0] | Reserved | E | A | I | F | T | M[4:0] |
另一个版本:
保留位(Reserved)
为将来的扩展预留
标志位(N,Z,C,V,Q)
N:符号标志,一般简写为SF(Sign Flag),也有写作NF。两个补码表示的带符号数进行运算时,NF=1表示结果为负数(<0);NF=0表示结果为非负数(≥0)。
N:负数 ? 1 : 0
Z:零标志,一般简写为ZF(Zero Flag)。ZF=1表示运算结果为0;ZF=0表示运算结果不为0。
Z:运算结果为0 ? 1 : 0
C:进位标志,一般简写为CF(Carry Flag)。简单来说CF=1表示运算结果有进位;CF=0表示运算结果无进位。实际上它有四种情况: 1、加法运算(包括比较指令 CNM):C=1:运算结果产生了进位时(无符号数溢出);C=0:运算结果没有进位。 2、减法运算(包括比较指令 CMP):C=0:运算时产生了借位(无符号数溢出);C=1:没有借位。 3、对于包含移位操作的非加 / 减法运算指令,C 为移出值的最后一位。 4、对于其他的非加 / 减法运算指令,C 的值通常不变。
C:运算结果有进位 ? 1 : 0
V:溢出标志,一般简写为OF(Overflow Flag)。简单来说OF=1表示运算结果有溢出;OF=0表示运算结果无溢出。实际上它有两种情况: 1、对于加 / 减法运算指令,当操作数和运算结果为二进制的补码表示的有符号数时,V=1 表示符号位溢出。 2、对于其他的非加 / 减法运算指令,V 的值通常不改变。
V:溢出 ? 1 : 0
Q:DSP运算溢出标志。 在 ARM v5 及以上版本的 E 系列处理器中,用 Q 标志位指示增强的 DSP 运算指令是否发生了溢出。在其它版本的处理器中,Q 标志位无定义。
控制位(A,I,F,T)
A:中断禁止位(abort) I:IRQ标志位。I=1表示禁止快速中断请求(IRQ)中断 F:FIQ标志位。F=1表示禁止外部中断请求(FIQ)中断
模式位(M[4:0])
注:模式位也是控制位的一种 ARM处理器的7种运行模式
处理器模式 | 描述 |
---|
用户模式(User) | 正常程序执行的模式 | 快速中断模式(FIQ) | 用于高速数据传输和通道处理 | 外部中断模式(IRQ) | 用于通常的中断处理 | 特权模式(Supervisor) | 供操作系统使用的一种保护模式 | 数据访问中止模式(Abort) | 用于虚拟存储及存储保护 | 未定义指令中止模式(Undefined) | 用于支持通过软件仿真硬件的协处理器 | 系统模式(System) | 用于运行特权级的操作系统任务 |
补充1:位的类型
用户可写位:在任意模式下都可写,N,Z,C,V,Q,和GE[3:0]以及E位都是用户可写的。 特权模式位:在特权模式下可写,用户模式下写特权位没有效果,A,I,F,T和M[4:0]位都是特权位。 执行状态位:在特权模式下可写,用户模式下写执行状态位没有效果,J和T位都是执行状态位,在ARM状态下一直为0。
补充2:条件转移指令
无符号:涉及进位/借位标志CF、零标志ZF(无符号数没有溢出的问题,只有进位和借位) 有符号:涉及符号标志SF、溢出标志OF、零标志ZF
例1:无符号整数比较大于时转移。 假设m>n,则m-n>0,没有进位/借位,也不为0,故CF和ZF都为0。无符号数不涉及符号标志SF和溢出标志OF,故都为0。
例2:无符号数比较小于等于时转移。 假设m≤n,则m-n≤0,当前一个数小于后一个数,有借位,故CF为0;当两个数相等,ZF=0。无符号数不涉及符号标志SF和溢出标志OF,故都为0。
补充3:区分进位/借位标志CF、溢出标志OF
CF:加法时最高位进位或减法时最高位借位,CF=1,否则CF=0; 人为判断:两个二进制数相加如果某一相同位上都为1则产生进位;两个二进制数相减如果某一相同位上被减数为0而减数为1则产生借位; 机器判断:减法时进位输出与1异或,加法时进位输出与0异或。异或:相同为0,不同为1。 OF:带符号数算术结果超过表示范围,OF=1,否则OF=0。
例1:FFFF FFFFH-FFFF FFF0H=FFFF FFFFH+0000 0010H=(1)0000 000FH(注意取补码的反是带符号位取反+1,不是取反就行了) ①减法,考虑借位。因为被减数最高位为1,减数最高位为1,没有借位,故CF=0;进位输出C=1,CF=C⊕1=0。 ②OF=0
例2:0000 0000H-FFFF FFFFH=0000 0000H+0000 0001H=(0)0000 0000H ①减法,考虑借位。因为被减数最高位为0,减数最高位为1,产生借位,故CF=1;进位输出C=0,CF=C⊕1=1。
参考: 1:程序状态寄存器PSR 2:ARM状态寄存器-PSR
|