ARM cmp命令详解(转)

ARM 155浏览



转自:https://blog.csdn.net/ftx2540993425/article/details/29926075

ARM指令的基本格式

ARM指令的基本格式为:

<Opcode>   {<Cond>}  {S}  <Rd> ,  <Rn>  { , <Opcode2> }

其中,<  >内的项是必需的,{  }内的项是可选的

(1)Opcode项

Opcode是指令助记符,即操作码,说明指令需要执行的操作,在指令中是必需的。

(2)Cond项(command)

Cond项表明了指令的执行的条件,每一条ARM指令都可以在规定的条件下执行,每条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码用2个字符表示,这两个字符可以添加至指令助记符的后面,与指令同时使用。当指令的执行条件满足时,指令才被执行,否则指令被忽略。如果在指令后不写条件码,则使用默认条件AL(无条件执行)

指令的条件码

条 件 码

助记符后缀

标    志

含    义

0000

EQ

Z置位

相等equal

0001

NE

Z清零

不相等not equal

0010

CS

C置位

无符号数大于或等于Carry Set

0011

CC

C清零

无符号数小于

0100

MI

N置位

负数minus

0101

PL

N清零

正数或零plus

0110

VS

V置位

溢出

0111

VC

V清零

没有溢出

1000

HI

C置位Z清零

无符号数大于high

1001

LS

Z置位C清零

无符号数小于或等于less

1010

GE

N等于V

带符号数大于或等于

1011

LT

N不等于V

带符号数小于least

1100

GT

Z清零且(N等于V)

带符号数大于great

1101

LE

Z清零或(N不等于V)

带符号数小于或等于

1110

AL

忽略

无条件执行all

1111

NV 

never 

 

条件码应用举例:

例:比较两个值大小,并进行相应加1处理,C语言代码为:

if  ( a > b )  a++;

else  b++;

对应的ARM指令如下(其中R0中保存a 的值,R1中保存b的值):

CMP  R0, R1  ; R0与R1比较,做R0-R1的操作

ADDHI  R0, R0, #1  ;若R0 > R1, 则R0 = R0 + 1

ADDLS  R1, R1, #1  ; 若R0 <= R1, 则R1 = R1 + 1

 

CMP比较指令,用于把一个寄存器的内容和另一个寄存器的内容或一个立即数进行比较,同时更新CPSR中条件标志位的值。指令将第一操作数减去第二操作数,但不存储结果,只更改条件标志位。

CMP  R1, R0  ;做R1-R0的操作。

CMP  R1,#10  ;做R1-10的操作。

(3) S项(sign)

S项是条件码设置项,它决定本次指令执行的结果是否影响至CPSR寄存器的相应状态位的值。该项是可选的,使用时影响CPSR,否则不影响CPSR。

(4)Rd项(destination)

Rd是指令中的目标寄存器,它是必需的。根据指令的不同,有些指令中要求Rd必须有R0~R7之间,有些要求Rd必须在R0~R14之间,有些则没有特殊要求。

(5)Rn项

Rn是第一个操作数的寄存器,和Rd一样,不同的指令对其的使用有不同的要求。

(6)Opcode2项

Opcode2项是第二个操作数,在ARM指令中,该操作数有三种形式:立即数形式、寄存器Rm形式和寄存器加移位形式(Rm, shift)。

示例:

SUB  R3,  R1,  #10

SUB  R3,  R1,  R2

SUB  R3,  R1,  R2,  LSL  #2

SUB  R3,  R1,  R2,  LSL  R0

MOVLS R2, R0 ; if R0 < R1 则 将小值存入R2中
在这个例子中,MOVLS 能够正确执行的条件C=0 and z=1 成立,是通过CMP设置了。
 
 
若执行指令后
ZF=1 这个简单,则说明两个数相等,因为zero为1说明结果为0
当无符号时:
CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2
当有符号时:
若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2
最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出