DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 131|回复: 0
打印 上一主题 下一主题

ARM处理器CPSR标志位和条件符之间的关系

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-16 18:43:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

                      本文目的是要理清ARM处理器的CPSR状态标志和ARM指令的条件符之间的关系。
  一、CPSR寄存器
  ARM V4的CPSR寄存器(和保存它的SPSR寄存器)中的位分配如下图1所示。






  三、关于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.a0, bb
  3.a0
  参照上面提到过的判断溢出标志的简单规则,可以得出:在此情况下,
  减法操作时如果结果小于0 (N=1),则不会出现符号溢出
  所以(在N=1 V=1前提下a0)这种情况不可能出现
  4.a>0, b>0
  减法操作不可能出现符号溢出。
  其它项的分析过程类似。
  五、总结
  尽管以上分析看起来有点复杂,但使用时在大多数情况下用一个简单的条件测试指令即可,不需要程序员计算出条件码的精确值即可得到需要的结果。
            
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-11-16 12:54 , 耗时 0.098544 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表