汇编中的符号
一、指令
能够编译生成一条32bit机器码,并且能被CPU识别和执行
ARM指令集
1、数据处理指令:
进行数学运算、逻辑运算
数据搬移指令:
MOV R1,#1 @R1=1
MOV PC, #0
MOV R2, R1 @R2=R1
MVN R0 ,#0xFF @R0= ~0xFF、
MOV R0, #0x12345678
@立即数
能放在MOV之后的数,0-255,包含在指令当中的数,属于指令的一部分,优点:速度快取指的时候就可以将其读取到CPU,不用单独去内存读取,缺点:不能是任意的32位的数字,有局限性
@伪指令
MOV R0,#0xFFFFFFFF
@加法指令
ADD R1,R2,R3 @R1=R2+R3
@减法指令
SUB R1, R2, R3 @R1=R2-R3
@逆向减法指令(当想让数减寄存器时使用)
RSB R1, R2, R3 @R1 = 3-R2
@乘法指令(只能是两个寄存器相乘)
MUL R1, R2, R3 @R1 = R2 * R3
@按位与指令
AND R1, R2, R3 @R1 = R2 & R3
@按位或指令
ORR R1, R2, R3 @R1 =R2 | R3
@按位异或指令
EOR R1, R2, R3 @R1 =R2 ^ R3
@左移指令
MOV R2, #0xF0
MOV R3, #0x2
LSL R1, R2, R3 @R1 = (R2 <<R3)
@右移指令
LSR R1, R2, R3 @R1 = (R2 >> R3)
@位清零指令
BIC R1, R2, #0xF @第二操作数中哪一位为1,就将第一操作寄存器中哪一位清零,将结果放入目标寄存器
@数据运算指令的格式扩展
MOV R1, R2, LSL #1 @R1 = ( R2<<1 )
@数据运算指令对条件位(N、Z、C、V)的影响
默认情况下数据运算不会对条件位产生影响,当在指令后加后缀“s”后可以影响
MOV R1, #3
SUBS R2, R1, #5
@两个64位的数据在32位的CPU上做加法运算
第一个数的低32位放在R1
第一个数的高32位放在R2
第二个数的低32位放在R3
第二个数的高32位放在R4
运算结果的低32位放在R5
运算结果的高32位放在R6
第一个数
0x00000001 FFFFFFFF
第二个数
0x00000002 00000002
MOV R1, #0xFFFFFFFF
MOV R2, #0x00000001
MOV R3, #0x00000002
MOV R4, #0x00000002
ADDS R5, R1,R3
ADC R6, R2,R4
R5 = R1 +R3
@本质: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'
《操作码:表示执行哪种操作》《目标寄存器:用于存储运算的结果》《第一操作寄存器:存储第一个参与运算的数据(只能是寄存器)》《第二操作数:第二个参与运算的数据(可以是寄存器或立即数)》
2、跳转指令:
实现程序的的跳转,本质就是修改了PC寄存器
3、load/srore指令:
访问(读写)内存
4、状态寄存器传送指令:
用于访问(读写)CPSR寄存器
5、软中断指令:
出发软中断
6、协处理器指令:
操作协处理器的指令
二、伪指令
本身不是指令,编译器可以将其替换成若干条指令
三、伪操作
不会生成指令,只是在编译阶段高速编译器怎么编译