Chinaunix首页 | 论坛 | 博客
  • 博客访问: 392807
  • 博文数量: 200
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 810
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-07 12:12
文章分类

全部博文(200)

文章存档

2015年(2)

2013年(198)

分类:

2013-01-07 14:14:53

ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位。在数据处理指令中使用S后缀来实现该功能。

不要在CMP,CMN,TST或者TEQ指令中使用S后缀。这些比较指令总是会更新标志位。

Thumb模式下,所有数据处理指令都更新CPSR中的标志位。有一个例外就是:当一个或更多个高寄存器被用在MOVADD指令时,此时MOVADD不能更新状态标志.

几乎所有的ARM指令都可以根据CPSR中的ALU状态标志位来条件执行。参见表2-1条件执行后缀表。

ARM模式下,你可以:

· 根据数据操作的结果更新CPSR中的ALU状态标志;

· 执行其他几种操作,但不更新状态标志;

· 根据当前状态标志,决定是否执行接下来的指令。

Thumb模式,大多数操作总是更新状态标志位,并且只能使用条件转移指令(B)来实现条件执行。该指令(B)的后缀和在ARM模式下是一样的。其他指令不能使用条件执行。

2.5.1 ALU状态标志

CPSR寄存器包含下面的ALU状态标志:

点击看大图

2.5.2 执行条件

N,Z,C,V相关的条件码后缀如下表所列:

点击看大图

举例说明:

 

示例1:

ADD            r0, r1, r2              ; r0 = r1 + r2, 不更新标志位

ADDS         r0, r1, r2      ; r0 = r1 + r2, 后缀S表示更新标志位

ADDCSS     r0, r1, r2      ; If C 标志为1,则执行r0 = r1 + r2, 且更新标志,

CMP             r0, r1            ; CMP指令肯定会更新标志.

 

示例2(请自行分析)

gcd        CMP r0, r1

BEQ end

BLT less

SUB r0, r0, r1

B gcd

less

SUB r1, r1, r0

B gcd

end

http://blog.csdn.net/shansan/article/details/3137231

阅读(719) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~