一、数据处理指令(一)
汇编指令不区分大小写,但是同一条指令中不能有两种写法
(一)数据搬移指令 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、数据运算指令格式
<操作码><目标寄存器><第一操作寄存器><第二操作数>
操作码:表示执行哪种操作
目标寄存器:用于存储运算结果
第一操作寄存器:存储第一个参与运算的数据(只能是寄存器)
第二操作数:第二个参与运算的数据(寄存器/立即数)