数据运算指令基本格式
《操作码》《目标寄存器》《第一操作寄存器》《第二操作数》
①操作码: 表示执行哪种运算
②目标寄存器: 用来存储运算结果
③第一操作寄存器:第一个参与运算的数据(只能是寄存器)
④第二操作数: 第二个参与运算的数据(可以是寄存器也可以是立即数)
一、数据搬移指令
1、补充:立即数
①概念:能够写在MOV后且能被编译成功的数
②本质:就是包含在指令当中的数,是指令的一部分
③优点:取指的时候就可以将其读到CPU,不用单独去内存读取,速度快
④缺点:不能是任意的32位数字,有局限性
2、MOV
①使用方法:
MOV R1, #1 相当于R1=1
3、MVN
①使用方法:
MVN R1, #0xFF 相当于R1=~0xFF=0xFFFFFF00
把0xFF按位取反后再搬移给R1
二、加法指令
1、ADD
ADD R1, R2, R3 相当于R1 = R2 + R3
ADD R1, R2, #1 相当于R1 = R2 + 1
2、ADDS
带进位的加法指令
MOV R1, #0xFFFFFFFF
MOV R2, #0x00000001
ADDS R3, R1, R2
三、减法指令
1、SUB
ADD R1, R2, R3 相当于R1 = R2 - R3
ADD R1, R2, #1 相当于R1 = R2 - 1
2、RSB
逆向减法指令
ADD R1, R2, R3 相当于R1 = R3 - R2
3、SUBS
带借位的减法指令
MOV R1, #0x00000001
MOV R2, #0x00000005
SUBS R3, R1, R2
四、乘法指令
1、MUL
MUL R1, R2, R3 相当于R1 = R2 * R3
注意:乘法指令只能用于两个寄存器相乘
五、按位与指令
1、AND
AND R1, R2, R3 相当于R1 = R2 & R3
六、按位或指令
1、ORR
ORR R1, R2, R3 相当于R1 = R2 | R3
七、按位异或指令
1、EOR
EOR R1, R2, R3 相当于R1 = R2 ^ R3
八、左移指令
1、LSL
LSL R1, R2, R3 相当于R1 = (R2 << R3)
九、右移指令
1、LSR
LSR R1, R2, R3 相当于R1 = (R2 >> R3)
十、位清零指令
1、BIC
MOV R2, #0xFF
BIC R1, R2, #0x0F 相当于R1 = 0xF0
第二操作数中的哪一位为1,就将第一操作寄存器的中哪一位清零,然后将结果写入目标寄存器
十一、跳转指令
1、B
不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址
2、BL
带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址,同时将跳转指令下一条指令的地址存储到LR寄存器
3、直接修改PC的值
一般不建议使用,需要自己计算目标指令的绝对地址,容易出错
十二、比较指令
1、CMP
本质就是一条减法指令(SUBS),只是没有将运算结果存入目标寄存器;常与条件码搭配使用
2、条件码
3、案列
MOV R1, #1
MOV R2, #2
CMP R1, R2
BEQ FUNC 如果R1和R2相等就跳转到FUNC函数,否则就执行下条指令
ADD R3, R2, R1
注:ARM指令集中大多数指令都可以带条件码后缀
十三、写内存指令
1、STR
MOV R1, #0xFF000000
MOV R2, #0x40000000
STR R1, [R2] 将R1寄存器中的数据写入到R2指向的内存空间
2、STRB
MOV R1, #0xFF000000
MOV R2, #0x40000000
STRB R1, [R2] 将R1寄存器中的数据的bit[ 7:0 ]写入到R2指向的内存空间
3、STRH
MOV R1, #0xFF000000
MOV R2, #0x40000000
STRH R1, [R2] 将R1寄存器中的数据的bit[ 15:0 ]写入到R2指向的内存空间
十四、读内存指令
1、LDR
MOV R2, #0x40000000
LDR R1, [R2] 将R2指向的内存空间中的数据读取到R1寄存器
2、LDRB
MOV R2, #0x40000000
LDRB R1, [R2] 将R2指向的内存空间中的数据的[ 7:0 ]读取到R1寄存器
3、LDRH
MOV R2, #0x40000000
LDRH R1, [R2] 将R2指向的内存空间中的数据的[ 15:0 ]读取到R1寄存器
十五、LDR
LDR指令用来将数据从内存加载到寄存器