arm汇编条件码

来源:互联网 发布:linux 文件排序 编辑:程序博客网 时间:2024/06/04 23:28

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

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

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

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

在ARM模式下,你可以:

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

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

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

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

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

http://blog.ednchina.com/Upload/Blog/2007/7/17/e69a0ec7-ce04-4bfb-b7a3-8f4fb4517673.JPG
上图描述的是汇编指令如何影响CPSR中的相关ALU状态寄存器,非常重要!!!


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

http://blog.ednchina.com/Upload/Blog/2007/7/17/7ab687ca-e45c-41f9-8cd9-e1e2c00ce482.JPG

操作码 条件码助记符 标志 含义 0000 EQ Z=1 相等 0001 NE(Not Equal) Z=0 不相等 0010 CS/HS(Carry Set/High or Same) C=1 无符号数大于或等于 0011 CC/LO(Carry Clear/LOwer) C=0

 无符号数小于

 0100 MI(MInus) N=1 负数 0101 PL(PLus) N=0 正数或零 0110 VS(oVerflow set) V=1 溢出 0111 VC(oVerflow clear) V=0 没有溢出 1000 HI(HIgh) C=1,Z=0 无符号数大于 1001 LS(Lower or Same) C=0,Z=1 无符号数小于或等于 1010 GE(Greater or Equal) N=V 有符号数大于或等于 1011 LT(Less Than) N!=V 有符号数小于 1100 GT(Greater Than) Z=0,N=V 有符号数大于 1101 LE(Less or Equal) Z=1,N!=V 有符号数小于或等于 1110 AL 任何 无条件执行(默认) 1111 NV 任何

 从不执行




举例说明:


示例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





0 0
原创粉丝点击