L12D6 数据处理指令

一、数据处理指令(一)

汇编指令不区分大小写,但是同一条指令中不能有两种写法

(一)数据搬移指令 MOV

1、给寄存器赋值

MOV R1 #1         @1->R1

MOV R2 #1         @2->R2

MOV R3 #1         @3->R3

2、把寄存器的值赋给另外一个寄存器

MOV R2 R1

(二)数据搬移指令 MVN

MVN R0,#0xFF
@R0 = ~ 0xFF

(三)立即数

立即数概念:能够直接赋值给寄存器的合法的数,用MOV指令能够直接编译的就是立即数(0~255),不能直接编译的不是。LDE指令不需要考虑是不是立即数。

立即数的本质就是包含在指令当中的数,属于指令的一部分。取值可以即取值又取数据。而变量是单独开辟了一片地址空间,并不包含在指令中。

立即数的优点:速度快,取指令的时候就可以将其读取到CPU,不用单独去内存读取,速度快。

立即数的缺点:不能是任意32位数,0~255以及一些离散的数,有局限性。

1、机器码

1)不同的指令机器码前几位不同

2)不同的寄存器机器码中间几位不同

3)不同的数值机器码后面两位不同

2、立即数

 寄存器能够存储的数据位数有限

不合法

3、伪指令

MOV R0,0xFFFFFFFF

立即数超出范围,CPU不能执行,编译没有问题,编译器自动将其转换成其他等效指令。

二、数据处理指令(二)

(一)加法指令ADD

1、寄存器和寄存器相加

MOV R2,#5
MOV R3,#3
ADD R1,R2,R3

@R1 = R2 + R3

2、寄存器和具体的值相加

MOV R2,#5
ADD R1,R2,#3

3、错误演示

ADD R1,#5,#3

ADD R1,#5,R2

(二)减法指令 SUB

MOV R2,#3
SUB R1,R2,#2
MOV R2,#3
MOV R3,#2
SUB R1,R2,R3

(三)逆向减法指令 RSB

SUB不能实现  数-寄存器

MOV R2,#5
RSB R1,R2,#8

@R1 = 8 - R2

(四)乘法指令 MUL

MUL R1,R2,R3

乘法指令只能是两个寄存器相乘,不能使用立即数

(五) 汇编语言除法

汇编语言没有除法指令,上层代码中有除法,会转换成其他同等效果的操作。

例:a = 8 / 2

a >>1  a右移一位

位运算

(六)按位与指令 AND

AND R1,R2,R3

R1 = R2 & R3

(七)按位或指令 ORR

ORR R1,R2,R3

R1 = R2 | R3

(八)按位异或指令 EOR

EOR R1,R2,R3

R1 = R2 异或 R3

 (九)左移指令

LSL R1,R2,R3
R = (R2 << R3)

(十)右移指令

LSR R1,R2,R3

R1 = (R2 >> R3)

 (十一) 位清零BIC

不会更改寄存器,只是将新生成的数赋给目标寄存器

第二个数据哪一位为1,清楚第一个数据的哪一位

MOV R2,#0xFF
BIC R1,R2,#0x0F

(十二)数据运算指令的格式扩展

MOV R1,R2,LSL #1

将R2左移1位赋值给R1

三、数据处理指令(三)

CPSR寄存器

(一)数据运算指令对N、Z、C、V的影响

在默认情况下数据运算不会对条件位产生影响,当在指令后加后缀“S”才会产生影响

1、验证N位

MOV R2,#3
SUBS R1,R2,#5

2、验证Z位

3、验证C位

 4、验证V位

(二)CPRS中N、Z、C、V的作用

1、带进位的加法指令 ADC

32位寄存器每次能处理数据的最大位数是32,无法直接计算两个64位数相加减的结果。但是可以通过拆分计算。但是32位处理器运算64位数,效率更低,运算32位数都是直接运算效率相同。

@两个64位的数据做加法运算

@第一个数的低32位放在R1
@第一个数的高32位放在R2
@第二个数的低32位放在R3
@第二个数的高32位放在R4

@运算结果的低32位放在R5
@运算结果的高32位放在R6

@第一个数
@0x00000001 0x00000002

@第二个数
@0x00000003 0x00000004

MOV R1,#0x00000002
MOV R2,#0x00000001
MOV R3,#0x00000004
MOV R4,#0x00000003

ADD R5,R1,R3
ADD R6,R2,R4

@此种办法存在很大风险,一旦产生进位,计算出错

MOV R1,#0xFFFFFFFF
MOV R2,#0x00000001
MOV R3,#0x00000004
MOV R4,#0x00000003

ADC是带进位的加法指令

@ADC使用方法

ADDS R5,R1,R3
ADC R6,R2,R4

注意加法指令需要用到ADDS改变条件位,ADC会执行到上一条指令的条件位。

2、带进位的减法指令  SBC

四、数据处理指令(四)

一条C语言对应多条机器码

32位 4字节 ------int

64位 long long

编写C语言思考:

能写左移右移,不写除法

能写浮点型,不写整型

五、注意事项

1、PC自增4

指令地址是4的整数倍

2、自己更改PC的值(注意4的整数倍)

 MOV PC,#0

3、PC的值必须是4的整数倍

例:PC赋值为7,二进制为111,PC会自动更改最后两位为0,执行100

4、ARM为精简指令集

机器码为32位

复杂指令集机器码位数不固定

5、机器码

1)不同的指令机器码前几位不同

2)不同的寄存器机器码中间几位不同

3)不同的数值机器码后面几位不同

6、数据运算指令格式

<操作码><目标寄存器><第一操作寄存器><第二操作数>

操作码:表示执行哪种操作

目标寄存器:用于存储运算结果

第一操作寄存器:存储第一个参与运算的数据(只能是寄存器)

第二操作数:第二个参与运算的数据(寄存器/立即数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值