[摘]ARM的CPSR

知识文档

R13 别名 sp 堆栈指针

R14 别名 lr 专门用于子程序调用的返回值

R15 别名 pc 程序计数器

CPSR 当前程序状态寄存器

SPSR 备份状态寄存器,用于在程序异常终端时保存被中断程序的状态

运行模式位[4-0]

 0b10000 用户模式user

 0b10001 FIQ模式

 0b10010 IRQ模式

 0b10011 管理模式

 0b10111 终止模式Abort

 0b11011 未定义模式

 0b11111 系统模式

IFT[7-5],I=1禁止IRQ,F=1禁止FIQ,T=1执行thumb指令

[27-8]保留

NZCV[31-28]

 N-(负)标志,N=1表示运算结果为负数,N=0表示运算结果为正数或零

 Z-(零)标志,Z=1表示运算结果为零,Z=0表示运算结果为非零

 C-(进位)标志

  加法运算(包括比较指令cmn):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0.

  减法运算(包括比较指令cmp):当运算时发生了借位(无符号数下益出),C=0,否则C=1.

  对于包含移位操作的非加/减运算指令:C为移位操作中最后移出位的值.

  对于其他非加减运算指令:C的值通常保持不变.

 V-(溢出)标志

  对于加/减法运算指令:当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出

  对于其他非加/减运算指令:V的值通常不改变.

条件码:

EQ Z置位    相等

NE Z清零    不相等

CS C置位    无符号数大于或等于

CC C清零    无符号数小于

MI N置位    负数

PL N清零    正数或零

VS V置位    溢出

VC V清零    未溢出

HI C置位Z清零   无符号数大于

LS C清零Z置位   无符号数小于或等于

GE N等于V    带符号数大于或等于

LT N不等于V   带符号数小于

GT Z清零且(N等于V)  带符号数大于

LE Z置位且(N不等于V) 带符号数小于或等于

AL 忽略    无条件执行

 

ARM体系结构包含一个当前程序状态寄存器(CPSR)和五个备份的程序状态寄存器(SPSRs)。备份的程序状态寄存器用来进行异常处理,其功能包括:

─  保存ALU中的当前操作信息

─  控制允许和禁止中断

─  设置处理器的运行模式

    程序状态寄存器的每一位的安排如图2.6所示:

条件码标志(Condition Code Flags)

N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。

在ARM状态下,绝大多数的指令都是有条件执行的。

在Thumb状态下,仅有分支指令是有条件执行的。

条件码标志各位的具体含义如表2-1所示:

表2-1        条件码标志的具体含义

 

标志位

 

含    义

 

N

 

当用两个补码表示的带符号数进行运算时,N=1 表示运算的结果为负数;N=0 表示运算的结果为正数或零;

 

Z

 

Z=1 表示运算的结果为零;Z=0表示运算的结果为非零;

 

C

 

可以有4种方法设置C的值:

─ 加法运算(包括比较指令CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。

─ 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。

─ 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。

─ 对于其他的非加/减运算指令,C的值通常不改变。

 

V

 

可以有2种方法设置V的值:

─ 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。

─ 对于其他的非加/减运算指令,V的值通常不改变。

 

Q

 

在ARM v5及以上版本的E系列处理器中,用Q标志位指示增强的DSP运算指令是否发生了溢出。在其他版本的处理器中,Q标志位无定义。

 

 

 

在ARM体系中,所有ARM指令均可条件执行,设置了一些条件执行码,但这些条件码对应设置CPSR中的Z, C, N, V标志位:

l           0000 = EQ - Z set (equal)

l           0001 = NE - Z clear (not equal)

l           0010 = CS - C set (unsigned higher or same)

l           0011 = CC - C clear (unsigned lower)

l           0100 = MI - N set (negative)

l           0101 = PL - N clear (positive or zero)

l           0110 = VS - V set (overflow)

l           0111 = VC - V clear (no overflow)

l           1000 = HI - C set and Z clear (unsigned higher)

l           1001 = LS - C clear or Z set (unsigned lower or same)

l           1010 = GE - N set and V set, or N clear and V clear (greater or equal)

l           1011 = LT - N set and V clear, or N clear and V set (less than)

l           1100 = GT - Z clear, and either N set and V set, or N clear and V clear (greater than)

l           1101 = LE - Z set, or N set and V clear, or N clear and V set (less than or equal)

l           1110 = AL - always

l           1111 = NV - never

怎样去理解这些设置呢?拿1001 = LS - C clear or Z set (unsigned lower or same)来说:

是为什么LS就对应 C clear and Z set。看下面的例子:

MOV R0, #5

MOV R1, #6

CMP R0, R1

MOVLS R2, R0 ; if R0 < R1 则 将小值存入R2中

在这个例子中,MOVLS 能够正确执行的条件C=0 and z=1 成立,是通过CMP设置了,看看reference manual中的CMP设置规则:

C flag:For a subtraction, including the comparison instruction CMP, C is set to 0 if the subtraction produced a borrow (that is, an unsigned underflow), and to 1 otherwise.

Z flag: Is set to 1 if the result of the instruction is zero (which often indicates an equal result from

a comparison), and to 0 otherwise.

         这就不难理解了 LS 与标志位的对应了。下面给出标志位的设置规则,便于我们从中推导上面每一个例子。

In either case, the new condition code flags (after the instruction has been executed) usually mean:

N Is set to bit 31 of the result of the instruction. If this result is regarded as a two's complement

signed integer, then N = 1 if the result is negative and N = 0 if it is positive or zero.

Z Is set to 1 if the result of the instruction is zero (which often indicates an equal result from

a comparison), and to 0 otherwise.

C Is set in one of four ways:

? For an addition, including the comparison instruction CMN, C is set to 1 if the addition

produced a carry (that is, an unsigned overflow), and to 0 otherwise.

? For a subtraction, including the comparison instruction CMP, C is set to 0 if the

subtraction produced a borrow (that is, an unsigned underflow), and to 1 otherwise.

? For non-addition/subtractions that incorporate a shift operation, C is set to the last bit

shifted out of the value by the shifter.

? For other non-addition/subtractions, C is normally left unchanged (but see the

individual instruction descriptions for any special cases).

V Is set in one of two ways:

? For an addition or subtraction, V is set to 1 if signed overflow occurred, regarding the

operands and result as two's complement signed integers.

? For non-addition/subtractions, V is normally left unchanged (but see the individual

instruction descriptions for any special cases).

 

来看下GT (signed greater)标志位的设置:
 CMP -5, -4 ; 相减为不等于0,为负值,且有下溢出,所以N=1, V=1

 CMP 6,5 ; 相减后值为1(N=0),正值且无下溢(V=0)

2种运行状态:
ARM状态(32位)、Thumb状态(16位),两种状态之间可任意切换;
7种运行模式:
用户模式usr
快速中断fiq
外部中断irq
管理svc
系统sys
数据访问中止abt
未定义指令中止und

寄存器组织:
ARM状态:
R0~R14 通用寄存器
         R0~R7   未分组寄存器,所有7种运行模式下指向同一物理寄存器,在中断或异常处理等模式转换时,需防止寄存器中数据的破坏。
         R8~R14  分组 根据不同的运行模式访问不同的物理寄存器
R8~R12  除fiq外,其余同usr模式
R13~R14 除usr、sys外,其余有各自分组模式
R15 PC  程序计数器
R16     状态寄存器 
        CPSR通用
              SPSR 除usr、sys外,用于异常保护的CPSR的备份,异常时,保存CPSR值,异常退出时,将该值恢复到CPSR
Thumb状态:
R0~R7 通用
SP对应ARM状态R13
LR对应ARM状态R14
PC对应ARM状态R15
CPSR和SPSR与ARM状态同

R13 -SP stack pointer 堆栈指针,用于取指令操作
R14 -LR Load register 用于程序调用
PC -程序计数器,总是指向当前指令的下两条指令,即PC值为当前指令地址值加8个字节

程序状态寄存器:
CPSR 每一中模式下访问同一物理寄存器
SPSR 除usr、sys外,用于异常保护的CPSR的备份,异常时,保存CPSR值,异常退出时,将该值恢复到CPSR,每一中异常运行模式(除usr和sys)有各自的物理寄存器。其功能:保存ALU中的当前操作信息;控制允许和禁止中断;设置处理器的运行模式


统计上述,ARM处理器共有:
8个未分组(R0~R7)寄存器共享物理寄存器
2×5个分组物理寄存器:fiq模式分别独享一个fiq物理寄存器(对应R8_fiq~R14_fiq),其余模式分别共享一个通用物理寄存器
6个堆栈指针物理寄存器,R13×6
6个LR物理寄存器      R14×6
1个程序计数物理寄存器 
6个状态物理寄存器:一个CPSR,5个SPSR

8+10+6+6+1+6 = 37个物理寄存器

Thumb状态:
出去R8~R14未分组部分
SP 对应 ARM状态R13
LR 对应 ARM状态R14
PC 对应 ARM状态R15
CPSR对应ARM状态CPSR
SPSR 对应ARM状态SPSR
程序状态寄存器位标识:

条件标识位        保留        控制位
31        30        29        28        27        26        25        24        …        8        7        6        5        4        3        2        1        0
N        Z        C        V        .        .        .                …                I        F        T        M4        M3        M2        M1        M0

说明:
条件标识位[31 : 28]:它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。在ARM状态下,绝大多数指令都是有条件的执行的,在Thumb状态下,只有分支指令被有条件的执行
N:当用两个补码表示的带符号数进行运算时,N=1 表示运算的结果为负数;N=0 表示运算的结果为正数或零;
Z:Z=1 表示运算的结果为零;Z=0表示运算的结果为非零;
C:可以有4种方法设置C的值:
─ 加法运算(包括比较指令CMN):当运算产生了进位时(无符号数溢出),C=1,否则C=0。─ 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。
─ 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
─ 对于其他的非加/减运算指令,C的值通常不改变。
V:可以有2种方法设置V的值:
─ 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。
─ 对于其他的非加/减运算指令,C的值通常不改变。
保留位[27 : 8]:当改变PSR中的条件码标志位或者控制位时,保留位不要被改变,在程序中也不要使用保留位来存储数据。保留位将用于ARM版本的扩展。

控制位[7 : 0]:PSR的低8位(包括I、F、T和M[4:0])称为控制位,当发生异常时这些位可以被改变。如果处理器运行特权模式,这些位也可以由程序修改。 

I:I =1 表示禁止外部(硬件)中断(IRQ)
F:F=1 表示快速中断(FIQ)
T:反映处理器的运行状态。
对于ARM体系结构v5及以上的版本的T系列处理器,当该位为1时,程序运行于Thumb状态,否则运行于ARM状态。对于ARM体系结构v5及以上的版本的非T系列处理器,当该位为1时,执行下一条指令以引起为定义的指令异常;当该位为0时,表示运行于ARM状态。

运行模式位M[4 : 0]:M0、M1、M2、M3、M4是模式位。这些位决定了处理器的运行模式。具体含义如表2-2所示:
表2-2        运行模式位M[4:0]的具体含义
M[4:0]        处理器模式        可访问的寄存器
0b10000        用户模式        PC,CPSR,R0-R14
0b10001        FIQ模式        PC,CPSR, SPSR_fiq,R14_fiq-R8_fiq, R7~R0
0b10010        IRQ模式        PC,CPSR, SPSR_irq,R14_irq,R13_irq,R12~R0
0b10011        管理模式        PC,CPSR, SPSR_svc,R14_svc,R13_svc,,R12~R0,
0b10111        中止模式        PC,CPSR, SPSR_abt,R14_abt,R13_abt, R12~R0,
0b11011        未定义模式        PC,CPSR, SPSR_und,R14_und,R13_und, R12~R0,
0b11111        系统模式        PC,CPSR(ARM v4及以上版本), R14~R0
由表2-2可知,并不是所有的运行模式位的组合都是有效地,其他的组合结果会导致处理器进入一个不可恢复的状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值