本文目的是要理清ARM处理器的CPSR状态标志和ARM指令的条件符之间的关系。
一、CPSR寄存器
ARM V4的CPSR寄存器(和保存它的SPSR寄存器)中的位分配如下图1所示。
图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的值通常不改变
二、条件符及对应的标志位
表1 条件符描述表
三、关于C、V值更多的解释
处理器内部以补码表示有符号数,8个二制位能够表达的整数范围是:+127 ~ -128,16位表达的范围是:+32767 ~ -32768。如果运算结果超出了这个范围,就是产生了溢出,有溢出,说明有符号数的运算结果需要考虑溢出情况。
溢出标志V和进位标志C是两个意义不同的标志。进位标志表示无符号数运算结果是否超出范围;溢出标志表示有符号数运算结果是否超出范围。
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志C;同时,根据是否超出有符号数的范围设置溢出标志V。
应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。
判断运算结果是否溢出有一个简单的规则:只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出;其他情况下,则不会产生溢出。
代码举例1:
LDRr0, =0x7fffffff
LDRr1, =0x70000000;
ADDSr0, r0, r1; //结果=0xefffffff
对于无符号数运算来说,没有进位。
对于有符号数运算来说,溢出。
此时C=0 V=1;
代码举例2:
LDRr0, =0xffffffff
LDRr1, =0x70000000;
ADDSr0, r0, r1; //结果=0x6fffffff
对于无符号数运算来说,有进位。
对于有符号数运算来说,无溢出。
此时C=1 V=0;
代码举例3:
LDRr0, =0x8fffffff
LDRr1, =0xf0000000 ;
ADDSr0, r0, r1; //结果=0x7fffffff
此时C=? V=?;(思考一下,然后在ARM模拟器中验证下)
代码举例4://思考减法时,C值的影响
LDRr0, =0x3
LDRr1, =0x2
SUBSr0, r0, r1
对比:
LDRr0, =0x3
LDRr1, =-2;(-2的补码0xfffffffe会送到r1)
ADDSr0, r0, r1
四、CPSR状态标志和ARM指令的条件符之间的关系
有了上面的背景知识以后,接下来思考表1中CPSR状态标志和ARM指令的条件符之间的关系,下面选取其中的一项来分析。
如:GE:(有符号数大于等于)
N=0 V=0:结果是大于等于0的数,且无符合溢出,所以大于等于关系成立
N=1 V=1:结果小于0,但有符号溢出
考虑以下情况:c=a-b
1.a<0, b<0
减法操作时不可能符号溢出
2.a>0, b<0
可能出现N=V=1?? 如(8位数):100-(-100)=200
显然a>b
3.a<0, b>0
参照上面提到过的判断溢出标志的简单规则,可以得出:在此情况下,
减法操作时如果结果小于0 (N=1),则不会出现符号溢出
所以(在N=1 V=1前提下a<0,b>0)这种情况不可能出现
4.a>0, b>0
减法操作不可能出现符号溢出。
其它项的分析过程类似。
五、总结
尽管以上分析看起来有点复杂,但使用时在大多数情况下用一个简单的条件测试指令即可,不需要程序员计算出条件码的精确值即可得到需要的结果。(作者:刘洪涛,华清远见嵌入式学院讲师。)
分享到:
相关推荐
2. **CPSR标志位与条件符的关系** ARM指令集支持多种条件执行,条件符(如:EQ、NE、LT、GT等)基于CPSR中的标志位来决定指令是否执行。例如: - GE(Greater Than or Equal,大于或等于):当N=0且V=0时,表示...
### ARM处理器中“8位位图”的理解和应用 #### 一、引言 在学习ARM处理器的汇编语言时,我们经常会遇到一些特定的规则和约束。这些规则是为了确保指令的有效性和正确性,同时也在一定程度上反映了硬件设计的考虑。...
2. CPSR寄存器:CPSR(Current Program Status Register)是ARM处理器的一个状态寄存器,它存储了当前程序的状态信息,包括标志域、状态域、扩展域和控制域。CPSR寄存器可以通过MSR指令进行读写操作。 3. MSR指令:...
- **当前处理器状态寄存器(CPSR)**:包含各种标志位和其他状态信息,用于控制和监控处理器的操作。 **5.3 标志位** ARM体系结构中的标志位(Flag)用于表示处理器的状态信息,例如进位标志(C)、零标志(Z)等。这些...
ARM指令的编码格式通常包括指令助记符、条件码、操作是否影响CPSR、目标寄存器、源寄存器和第二个操作数(如果有的话)。第二个操作数可以是立即数或寄存器,并可能涉及移位操作。 在数据处理指令中,第二个操作数...
ARM处理器采用定长指令格式,所有指令为32位,这使得它在性能和效率上具有优势,特别是在32位嵌入式RISC处理器市场中占据了主导地位。ARM处理器的寄存器组织包括31个通用寄存器(包含程序计数器PC)和6个状态寄存器...
- **条件执行**:允许根据CPSR中的标志位决定是否执行指令。 - **数据处理操作数**:如加法、减法、与、或等操作。 - **内存访问操作数**:用于指定加载或存储数据的位置。 通过上述知识点的介绍,我们了解到ARM...
- 条件码可以附在指令助记符后面,如EQ(相等)、NE(不相等)等,根据CPSR中的标志位判断条件。 5. **ARM寻址方式** - 立即寻址:操作数直接在指令中给出,如`ADD R0, R0, #1`。 - 寄存器寻址:操作数存储在...
在ARM处理器中,通过设置CPSR的I位来禁止中断,F位用于禁止快中断。子程序结束时,通常会使用指令如"MOV PC, R14"来恢复程序计数器。在嵌入式系统的存储层次结构中,Cache由于靠近CPU,其存取速度最快。烧录到FLASH...
条件执行依赖于程序状态寄存器(CPSR)中的标志位,如N(负数)、Z(零)、C(进位/借位)和V(溢出)。例如,“BEQ”表示“如果Z标志位置位,则跳转”,意味着如果两个数相等,则执行跳转。 #### 条件码 ARM指令...
### ARM指令集详解 #### 一、ARM指令集概述 ARM指令集是为基于ARM架构的微处理器设计的一套指令集合。这套指令集定义了处理器...通过掌握这些指令的使用方法,开发者可以更高效地利用ARM处理器的功能,优化程序性能。
ARM微处理器的指令系统是其架构的核心组成部分之一,通过丰富的指令集和灵活的寻址方式,ARM处理器能够在各种应用场景中提供高性能和高效的计算能力。无论是ARM指令集还是Thumb指令集,都能够满足不同层次的需求,从...
ARM汇编指令集是ARM处理器的核心部分,定义了ARM处理器可以执行的所有操作。 一、ARM指令的一般编码格式 ARM指令字长为固定的32位,一条典型的ARM指令编码格式为: opcode:指令操作符代码 cond:指令执行的条件...
ARM指令系统是嵌入式系统设计中的核心组成部分,尤其在ARM9处理器中,结合了32位ARM指令和16位Thumb指令,以实现高效、精简的计算操作。本节将详细介绍ARM指令系统的几个关键方面,包括指令分类、格式以及寻址方式。...
ARM处理器支持两种不同的指令集:ARM指令集和Thumb指令集。ARM指令集是一种32位的精简指令集计算机(RISC),适用于高性能计算环境;而Thumb指令集则是为了适应嵌入式系统的需求而设计的一种更紧凑的16位指令集。 #...
指令助记符是帮助开发者记忆和理解指令用途的符号表示,执行条件则是决定指令在何种状态下执行,CPSR寄存器用于记录处理器状态,包含了程序的执行状态如零标志、负标志、进位标志等。例如,“LDR R0, [R1]”指令用于...
2. **程序状态寄存器处理指令**:MRS(Move to Register from Status)和MSR(Move to Status Register)用于读取和设置程序状态寄存器(PSR),PSR包含了处理器状态和条件标志。 3. **跳转指令**:B(Branch)和BL...
- ARM处理器通过一组标志位来记录运算结果的状态,如零标志位(Z)、进位标志位(C)等。 **4. 异常处理** - 当处理器遇到某些特殊事件时(如中断请求、除零错误等),会触发异常处理流程,进入相应的异常模式。 ...
在ARM状态下,大多数指令都有4位的条件码,这些条件码根据CPSR(Current Program Status Register)中的状态进行判断,例如,如果条件码是'EQ'(0000),那么只有当Z标志(Zero flag)置位时,指令才会被执行。...