许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  数据处理指令(二):加减乘运算、逻辑与或指令、位清零BIC详解

数据处理指令(二):加减乘运算、逻辑与或指令、位清零BIC详解

阅读数 7
点赞 0
article_banner

默认情况下,执行指令不会改变CPSR寄存器的状态位,若想改变CPSR寄存器的状态,需要在原指令的后面加上‘ S ’,比如ADD要想在进位时将进位状态保存到CPSR,需要使用指令ADDS。

一、数据运算指令

1、加法指令

(1) 加法指令 ADD (相加时不考虑进位)

ADD在做加法运算时,不考虑任何进位,包含了两方面。

  • ADD 运算产生的进位,会忽略(CPSR寄存器的C状态位不会改变)
       
  • 上一次运算产生的进位,也会忽略
       
ADD R1, R2, R3      @ R1 = R2 + R3 ADD R1, R2, #5      @ R1 = R2 + 5 ADD R1, #7, #5      @ 非法ADD R1, #7, R2      @ 非法

注意:正常情况下使用的指令都是ADD,寄存器一次可以处理32bit,如果是处理64bit 的数才会需要用到ADDS 和 ADC。


(2) 加法指令ADDS(保留进位状态)

默认情况下,ADD不会改变CPSR寄存器的状态位置,如果要改变CPSR,需要在原指令的后面加上‘ S ’,也就是指令ADDS。

使用格式和ADD完全一样:

ADDS R1, R2, R3    @ R1 = R2 + R3

(3) 带进位加法指令 ADC(相加时考虑进位)

ADC在做加法运算时,会考虑上一次运算产生的进位。

ADC R1, R2, R3    @ R1 = R2 + R3 + CPSR的C状态位


2、减法指令

(1) 减法指令 SUB

SUB和上面ADD 类  似,在做减法运算时,不考虑任何借位

  • SUB 运算产生的借位,会忽略(CPSR寄存器的C状态位不会改变)
       
  • 上一次运算产生的借位,也会忽略
       
SUB R1, R2, R3     @ R1 = R2 - R3SUB R1, R2, #1     @ R1 = R2 - 1

(2) 减法指令SUBS(保留借位状态)

SUB产生的借位,默认不保存,即不会更新到CPSR寄存器;如果要更新到CPSR寄存器,需要使用指令SUBS。

SUBS R1, R2, R3    @ R1 = R2 - R3

(3) 带借位减法指令 SBC

SBC 在做减法运算时,会考虑上一次运算产生的借位

SBC R1, R2, R3    @ R1 = R2 - R3 - (!CPSR的C状态位)

(4) 逆向减法指令 RSB

减法指令ADD只能是一个寄存器减去一个立即数,逆向减法指令可以让一个立即数减去一个寄存器。但是依然不能违背最初的格式。

RSB R1, R2, #5           @R1 = 5 - R2


3、乘法指令 MUL

乘法指令比较特殊,只能是两个寄存器相乘

MUL R1, R2, R3           @R1 = R2 * R3


二、逻辑运算指令

1、按位与指令 AND

AND R1, R2, R3        @ R1 = R2 & R3

2、按位或指令 ORR

ORR R1, R2, R3        @ R1 = R2 | R3

3、按位异或指令 EOR

EOR R1, R2, R3        @ R1 = R2 ^ R3

4、左移指令 LSL

LSL R1, R2, 1        @ R1 = R2 << 1

5、右移指令 LSR

LSR R1, R2, 1        @ R1 = R2 >> 1


三、拓展指令

上述指令都是可以在C语言中找到对应的,汇编语言也存在自己独有的指令

1、位清零指令 BIC

位清零可以将 “指定比特位” 置 0

MOV R2, #0xFF            @ R2 = 0xFF    BIC R1, R2, #0x0F        @ 将R2后四位清零,结果放入 R1 =》 R1 = R2 & (~0x0F)

R2 中保存的是 0xFF,转化成二进制:1111 1111

0x0F 转换 成二进制形式:                    0000 1111

最终结果:                                            1111 0000

0x0F后四位是1,说明要把R2后四位置 0,得到的运算结果放入 R1(0xF0)


2、运算指令与其他指令的混合使用

MOV R1, R2, LSL #1     

MOV 的格式是 MOV  <目标寄存器>  <第一操作数>

  • 目标寄存器:R1
  • 第一操作数:R2, LSL #1  


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空