目录
一、指令
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)使用协处理器进行运算。
-------------------------------------------------------------------------------------------------------------------------------
本来想用一篇文章发来着,但是太多了,目录也没改,兄弟们将就看吧。