数据处理指令

目录

一、指令

1.1 数据处理指令:数学运算、逻辑运算

1.1.1数据搬移指令

1.1.2机器码

1.1.3立即数

1.1.4数据运算指令基本格式

       1.1.5加法指令

 1.1.6减法指令、逆向减法指令、乘法指令

1.1.7位运算(逻辑运算)

1.1.8格式扩展

1.1.9数据运算指令对条件位(N、Z、C、V)的影响

 1.1.10CPSR的实际应用

1.1.11C语言和汇编


一、指令

指令:能够编译生成一条32位的机器码,且能被CPU识别和执行

1.1 数据处理指令:数学运算、逻辑运算


1.1.1数据搬移指令

        MOV R1, #1                @相当于R1 = 1
        MOV R2, R1               @R2 = R1
        MVN R0, #0xFF          @ R0 = ~0xFF

1.1.2机器码

 结论:通过红色框我们可以发现不同的指令对应的机器码前四位不同,准确来说是前三位。操作不一样的寄存器黄色框不一样,给他们赋值不同最后两位不一样。

1.1.3立即数


立即数的本质就是包含在指令当中的数,属于指令的一部分
立即数的优点:取指的时候就可以将其读取到CPU,不用单独去内存读取,速度快
立即数的缺点:不能是任意的32位的数字,有局限性

MOV R0, #0x12345678        @写这个报错
MOV R0, #0x12                    @写这个不报错
区分是不是立即数: 编译通过就是不通过就不是,一般0~255都是后面也有一些但是它们没什么规律。

立即数_百度百科        

https://www.yebaike.com/22/922228.html

如何快速判断立即数_TomLazy的博客-CSDN博客_立即数

 这段程序本来应该报错的,但是没有,我们debug一下看看编译器是怎么处理的:

编译器自动帮我们把这段程序换成了效果一样的另一段程序。 

1.1.4数据运算指令基本格式


  《操作码》《目标寄存器》《第一操作寄存器》《第二操作数》


    操作码 :                          指示执行哪种运算
    目标寄存器:                    存储运算结果
    第一操作寄存器:             第一个参与运算的数据(只能是寄存器)
    第二操作数:                    第二个参与运算的数据(可以是寄存器或立即数)

     
  1.1.5加法指令


   ADD R1, R2, R3                @相当于R1 = R2 + R3
   ADD R1, R2, #5                 @R1 = R2 + 5
    

 1.1.6减法指令、逆向减法指令、乘法指令


        SUB R1, R2, R3                @R1 = R2 - R3
        SUB R1, R2, #3                 @R1 = R2 - 3
        
        RSB R1, R2, #3                @ R1 = 3 - R2
        
        MUL R1, R2, R3               @ R1 = R2 * R3
        注意: 乘法指令只能是两个寄存器相乘,ARM指令集没有除法运算
        

1.1.7位运算(逻辑运算)


        @ 按位与指令
        AND R1, R2, R3                    @ R1 = R2 & R3
        
        @ 按位或指令
        ORR R1, R2, R3                   @ R1 = R2 | R3
        
        @ 按位异或指令
        EOR R1, R2, R3                   @R1 = R2 ^ R3
        
        @ 左移指令
        LSL R1, R2, R3                    @ R1 = (R2 << R3)
        
        @ 右移指令
        LSR R1, R2, R3                @ R1 = (R2 >> R3)
        
        @ 位清零指令
        MOV R2, #0xFF
        BIC R1, R2, #0x0F

 

 

第二操作数中的哪一位为1,就将第一操作寄存器的中哪一位清零,然后将结果写入目标寄存器

1.1.8格式扩展


MOV R2, #3
MOV R1, R2, LSL #1
@ R1 = (R2 << 1)

这种复合型的指令,只要是正确的,第一个指令是什么他就是什么指令

1.1.9数据运算指令对条件位(N、Z、C、V)的影响

看下cpsr寄存器可以参考我之前的文章

ARM寄存器组织与异常处理_宇努力学习的博客-CSDN博客


注意:默认情况下数据运算不会对条件位产生影响,在指令后加后缀”S“才可以影响,下图产生负数N位置1.


 变成3-3:

     
  Z和C都变成了1,Z是因为结果是0,C是因为产生了借位。

   

V等于1符号位溢出。

 1.1.10CPSR的实际应用

        ARM是32位机不是它只能进行32位运算,而是它一条指令是32位,我们可以借助CPSR寄存器实现64位甚至128位的运算。

        @ 带进位的加法指令
        @ 两个64位的数据做加法运算
        @ 第一个数的低32位放在R1
        @ 第一个数的高32位放在R2
        @ 第二个数的低32位放在R3
        @ 第二个数的高32位放在R4
        @ 运算结果的低32位放在R5
        @ 运算结果的高32位放在R6
        
        @ 第一个数
        @ 0x00000001 FFFFFFFF
        @ 第二个数
        @ 0x00000002 00000005
        
        @ MOV R1, #0xFFFFFFFF
        @ MOV R2, #0x00000001
        @ MOV R3, #0x00000005
        @ MOV R4, #0x00000002
        @ ADDS R5, R1, R3
        @ ADC  R6, R2, R4
        @ 本质:R6 = R2 + R4 + 'C'
        
        @ 带借位的减法指令
        
        @ 第一个数
        @ 0x00000002 00000001
        @ 第二个数
        @ 0x00000001 00000005
        
        @ MOV R1, #0x00000001
        @ MOV R2, #0x00000002
        @ MOV R3, #0x00000005
        @ MOV R4, #0x00000001
        @ SUBS R5, R1, R3
        @ SBC  R6, R2, R4
        @ 本质:R6 = R2 - R4 - '!C'

 

1.1.11C语言和汇编

一句C可能对应很多条汇编。

把数据类型改成long long在试试:

 

ADD变成了ADDS和ADC ,所以写短代码效率更高。

比如:a/2可以写成a>>1,右移可以直接执行,而除法需要组合执行。

ARM不能进行浮点型运算,所以有两种解决方案:

(1)转化成一堆其他的指令在进行运算

(2)使用协处理器进行运算。

-------------------------------------------------------------------------------------------------------------------------------

本来想用一篇文章发来着,但是太多了,目录也没改,兄弟们将就看吧。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇努力学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值