ARM处理器CPSR标志位和条件符之间…
2014-05-06 17:32
155 查看
转载地址http://www.embedu.org/Column/Column182.htm
ARM处理器CPSR标志位和条件符之间的关系
作者:刘洪涛,华清远见嵌入式学院讲师。
本文目的是要理清ARM处理器的CPSR状态标志和ARM指令的条件符之间的关系。
一、CPSR寄存器
ARM V4的CPSR寄存器(和保存它的SPSR寄存器)中的位分配如下图1所示。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
图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 条件符描述表
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
三、关于C、V值更多的解释
处理器内部以补码表示有符号数,8个二制位能够表达的整数范围是:+127 ~ -128,16位表达的范围是:+32767 ~
-32768。如果运算结果超出了这个范围,就是产生了溢出,有溢出,说明有符号数的运算结果需要考虑溢出情况。
溢出标志V和进位标志C是两个意义不同的标志。进位标志表示无符号数运算结果是否超出范围;溢出标志表示有符号数运算结果是否超出范围。
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志C;同时,根据是否超出有符号数的范围设置溢出标志V。
应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。
判断运算结果是否溢出有一个简单的规则:只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出;其他情况下,则不会产生溢出。
代码举例1:
LDR r0,
=0x7fffffff
LDR r1,
=0x70000000;
ADDS r0,
r0, r1; //结果=0xefffffff
对于无符号数运算来说,没有进位。
对于有符号数运算来说,溢出。
此时C=0
V=1;
代码举例2:
LDR r0,
=0xffffffff
LDR r1,
=0x70000000;
ADDS r0,
r0, r1; //结果=0x6fffffff
对于无符号数运算来说,有进位。
对于有符号数运算来说,无溢出。
此时C=1
V=0;
代码举例3:
LDR r0,
=0x8fffffff
LDR r1,
=0xf0000000 ;
ADDS r0,
r0, r1; //结果=0x7fffffff
此时C=?
V=?;(思考一下,然后在ARM模拟器中验证下)
代码举例4://思考减法时,C值的影响
LDR r0,
=0x3
LDR r1,
=0x2
SUBS r0,
r0, r1
对比:
LDR r0,
=0x3
LDR r1,
=-2;(-2的补码0xfffffffe会送到r1)
ADDS r0,
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
减法操作不可能出现符号溢出。
其它项的分析过程类似。
五、总结
尽管以上分析看起来有点复杂,但使用时在大多数情况下用一个简单的条件测试指令即可,不需要程序员计算出条件码的精确值即可得到需要的结果
ARM处理器CPSR标志位和条件符之间的关系
作者:刘洪涛,华清远见嵌入式学院讲师。
本文目的是要理清ARM处理器的CPSR状态标志和ARM指令的条件符之间的关系。
一、CPSR寄存器
ARM V4的CPSR寄存器(和保存它的SPSR寄存器)中的位分配如下图1所示。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
图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 条件符描述表
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
三、关于C、V值更多的解释
处理器内部以补码表示有符号数,8个二制位能够表达的整数范围是:+127 ~ -128,16位表达的范围是:+32767 ~
-32768。如果运算结果超出了这个范围,就是产生了溢出,有溢出,说明有符号数的运算结果需要考虑溢出情况。
溢出标志V和进位标志C是两个意义不同的标志。进位标志表示无符号数运算结果是否超出范围;溢出标志表示有符号数运算结果是否超出范围。
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志C;同时,根据是否超出有符号数的范围设置溢出标志V。
应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。
判断运算结果是否溢出有一个简单的规则:只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出;其他情况下,则不会产生溢出。
代码举例1:
LDR r0,
=0x7fffffff
LDR r1,
=0x70000000;
ADDS r0,
r0, r1; //结果=0xefffffff
对于无符号数运算来说,没有进位。
对于有符号数运算来说,溢出。
此时C=0
V=1;
代码举例2:
LDR r0,
=0xffffffff
LDR r1,
=0x70000000;
ADDS r0,
r0, r1; //结果=0x6fffffff
对于无符号数运算来说,有进位。
对于有符号数运算来说,无溢出。
此时C=1
V=0;
代码举例3:
LDR r0,
=0x8fffffff
LDR r1,
=0xf0000000 ;
ADDS r0,
r0, r1; //结果=0x7fffffff
此时C=?
V=?;(思考一下,然后在ARM模拟器中验证下)
代码举例4://思考减法时,C值的影响
LDR r0,
=0x3
LDR r1,
=0x2
SUBS r0,
r0, r1
对比:
LDR r0,
=0x3
LDR r1,
=-2;(-2的补码0xfffffffe会送到r1)
ADDS r0,
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
减法操作不可能出现符号溢出。
其它项的分析过程类似。
五、总结
尽管以上分析看起来有点复杂,但使用时在大多数情况下用一个简单的条件测试指令即可,不需要程序员计算出条件码的精确值即可得到需要的结果
相关文章推荐
- ARM处理器CPSR标志位和条件符之间的关系
- ARM处理器CPSR标志位和条件符之间的关系
- ARM处理器CPSR标志位和条件符之间的关系
- ARM处理器CPSR标志位和条件符之间的关系
- ARM处理器CPSR标志位和条件符之间的关系
- ARM处理器CPSR标志位和条件符之间的关系
- 按照条件在两个表之间拷贝数据 for mysql & sqlserver
- java:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
- 随机产生20个正整数存入数组a中,且每个数均在1000-9999之间(包含1000和9999)。对数组进行排序,要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数放入数组b中,如果
- 最简单删除SQL Server中所有数据的方法(不用考虑表之间的约束条件,即主表与子表的关系)
- 有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。 给定一个int数组A和数组的大小n,请
- 作业 4 函数应用 输出80到120之间的满足给定条件的所有整数,条件为构成该整数的每位数字都相同
- C语随机产生20个正整数存入数组a中,且每个数均在1000-9999之间(包含1000和9999)。对数组进行排序,要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数放入数组b中,
- Shell中的标志代表意义与条件判断(转)
- 题目:利用嵌套条件运算符来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示
- java实现树的节点之间距离;向下递归,注意找到一个满足条件的节点要break
- sql order by与索引之间的关系(where条件出现字段才有效)
- 查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数: (1)该数的十进制表示中有且仅有两个相同的数字位; (2)该数是素数。
- 我的JavaScript回顾之路_01—0206—++在前在后区别/&&和||/条件判断语句/循环语句的区别/字符串类型数字和数字类型之间的转换
- 在SQL Server中如何将两个日期之间的工作日作为查询条件