【嵌入式】ARM 指令系统 整理3

接 2

ARM数据处理指令

 数据处理指令只能对寄存器的内容进行操作,不允许对存储器中的数据进行操作,也不允许指令直接使用存储器的数据或在存储器之间传送数据。数据处理指令可分为三类:数据传送指令、算术逻辑运算指令和比较指令。
 数据传送指令用于寄存器和存储器之间进行双向传输;
 算术逻辑运算指令完成常用的算数与逻辑的运算,将结果保存在目标寄存器中,同时更新CPSR的条件标志位;
 比较指令是对寄存器与一个立即数或一个寄存器进行比较,不保存运算结果,只影响CPSR的条件标志位。

数据传送指令MOV和MVN

MOV指令

完成寄存器之间或寄存器与第二个操作数之间的数据传送。
#将寄存器r5的值传送给r4;

MVN指令

完成寄存器之间或寄存器与第二个操作数之间的数据非传送。与MOV指令不同的是把一个取反之后的值传送到目的寄存器中。
#将立即数0取反之后送到R0中,完成后R0=-1

算数逻辑指令

ADD指令(加法)

加法指令,将两个操作数相加存放到寄存器中。
  ADDC R0,R3.#10;      #R0=R3+10
  ADD R0,R2,R3,LSL#2      //R0=R2+R3*4

ADC指令(带进位的加法)

把两个操作数相加,再加上CPSR的C条件标志位的值存放到寄存器中。这样就可以做比32位大的数的加法。
ADDS R1,R2,R3;
#R1=R1+R3
ADC  R2,R2,R4;
#R2=R2+R4+C

SUB指令(减法)

操作数1减去操作数2,将结果保存到目的寄存器中。用于有符号数或无符号数的减法运算。
SUBS R0,R3,R4;
#R0=R3-R4
SUB R0,R2,R3,LSL#1;
#R0=R2-(R3<<1)

RSB(反减)

操作数2减去操作数1,将结果保存到目的寄存器中。用于有符号数或无符号数的减法运算。 
RSB R0,R3,R4;
#R0=R4-R3
SUB R0,R2,R3,LSL#1;
#R0=R3*2-R2

SBC(带借位的减法)

操作数1减去操作数2,再加上CPSR的C条件标志位的值存放到寄存器中。
SBC  R2,R2,R4;
#R2=R2-R4-C

RSC(带借位的反减法)

操作数2减去操作数1,再减去CPSR的C条件标志位的反码存放到寄存器中。
RSC   R0,R2,R3,LSL#1;
#R0=R3*2-R4-C的反码 同时刷新标志位

AND(逻辑与)

常用来清零,即屏蔽操作数为1的某些位
AND  R0,R2,R3;
#R0=R2^R3
AND R2,R2,#3;
#保持R2的0、1位,其余位清零

ORR(逻辑或)

常用来置1,即设置操作数为1的某些位
ORR  R0,R2,R3;
#R0=R2或R3
ORR R2,R2,#3;
#设置R2的0、1位,其余位保持不变

EOR(逻辑异或)

通常进行逻辑异或运算,常用来反转操作数的某些位。
EOR  R0,R2,R3;
#R0=R2异或R3
ORR R2,R2,#3;
#反转R2的0、1位为1,其余位保持不变             

BIC(位清除)

常用来清除操作数为1的某些位,将结果保存到目的寄存器中。
BIC  R0,R2,#2_0011;
清除R2中的0、1位,余位保持不变    
BIC R0,R2,#0X80000000;
#清除R2中的31位,其余位保持不变 ,刷新标志位            

MUL(乘法)

MUL  R0,R2,R5;
 #R0=R2*R5        

#+## MLA(乘加)
操作数1与操作数2相乘再将乘积加上操作数3,结果存到目的寄存器中。

MLA  R0,R1,R2,R3;
 #R0=R1*R2+R3        

SMULL(带符号的长乘法指令 )

操作数1与操作数2相乘再将乘积的低32位存到目的寄存器Low中,高32位存到目的寄存器High中。同时设置条件标志位。
与之对应的**UMULL**指令为无符号乘法指令。
SMULL  R0,R1,R2,R3;
 #R0=R2*R3   (低32位)     ,R1=R2*R3   (高32位) 

SMLAL(长乘加指令 )

操作数1与操作数2相乘再将乘积的低32位与寄存器Low中的值相加后存到目的寄存器Low中,高32位与寄存器High中的值相加存到目的寄存器High中。同时设置条件标志位。
与之对应的**UMLAL**指令为无符号长乘加指令。
SMULL  R0,R1,R2,R3;
 #R0=R2*R3   (低32位)  +R1   ,R1=R2*R3   (高32位) +R2

比较和测试指令

CMP 指令(比较指令)

该指令实际上是做一个减法运算,但不存储结果,只是刷新条件标志位。
结果为正/负数,则N=0/1;
结果为0/非0,则Z=1/0;
产生借位则C=0,否则C=1;
符号溢出则V=1,否则V=0。

CMN指令(比较非指令)

该指令实际上是做一个减法运算,与CMP不同的是用操作数1减去操作数2的非值,但不存储结果,只是刷新条件标志位。
对条件标志位的影响与比骄傲指令CMP相同。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值