1.ADD 加法指令
ADD Rx,Rx,#1 ; Rx=Rx+1
ADD Rd,Rx,Rx,LSL #n; Rx=Rx+Rx*(2**n)
ADD Rs,PC,#offset; 生成基于PC的跳转指针
2.ADC带进位加法指令
ADC和ADD指令联合使用可以实现两个64位的操作数相加。源64位操作数:R1R0,新64位操作数:R3R2
以下指令可以实现两个64位的操作数相加:
ADDS R4,R0,R2
ADDC R5,R1,R3
3.MOV 数据传送指令
MOV R0, R0 ; R0 = R0... NOP 指令
MOV R0, R0, LSL#3 ; R0 = R0 * 8
4.MVN 数据取反传送指令
MVN R0, #4 ; R0 = -5
【4(00000100b) 取反为 11111011,这个是数是-5的补码,所以r0=-5 】
MVN R0, #0 ; R0 = -1
6.SUB 减法指令
SUB R0, R1, R2 ; R0 = R1 - R2
SUB R0, R1, #256 ; R0 = R1 - 256
SUB R0, R2, R3,LSL#1 ; R0 = R2 - (R3 << 1)=R2-2*R3
注意:在SUBS指令中,如果发生了借位操作,CPSR寄存器中的C标志位设置成0,无借位则为1,这和 ADDS指令中的进位指令正好相反。
7.SBC 带借位减法指令
被减数:R1R0; 减数:R3R2
SUBS R4,R0,R2
SBC R5,R1,R3
8.RSB 逆向减法指令
RSB Rd,Rx,#0 ; Rd=-Rd
RSB Rd,Rx,Rx,LSL#n; Rd=Rx*(2**n-1)
9.RSC 带借位减法指令
例如:求一个64位数的相反数。64位数:R1R0, 相反数:R3R2
RSBS R2,R0,#0
RSC R3,R1,#0
其中R2=-R0,R3=-R1-(-C) , -C是逻辑操作
10.AND 逻辑与操作指令
AND R2,R1,R3 ; R2=R1&R3
ANDS R0,R0,#0X01; R0=R0&0X01,取出最低位数据
AND R0, R0, #3 ;R0=R0&3,保留R0中的0位和1位,丢弃别的位
11.ORR 逻辑或操作
ORR R0, R0, #3 ; 设置 R0 中位 0 和 1
12.EOR 逻辑异或操作
EOR R0,R0,#3 ; 反转R0中的0位和1位
13.BIC 位清除指令
BIC R0,R0,#0X0F ;将R0的最低四位清零,其余位不变(对#0X0F取反,然后与R0进行与运算)
14.CMP 比较指令
CMP R0,#10
15.CMN 基于相反数的比较指令
CMN R0,#1 ;把R0和-1进行比较
16.TST 位测试指令
TST R0,#1; 测试在R0中是否设置了位0
17.TEQ 相等测试指令
TEQ R0,R1 ;测试R0和R1是否相等
18.MUL 乘法指令
MUL R0,R1,R2 ; R0=R1*R2
MULS R0,R1,R2 ; R0=R1*R2,同时设置CPSR中的N位和Z位
19.MLA 乘加操作
MLA R0,R1,R2,R3 ; R0=R1*R2+R3
20.SMULL 64位有符号数乘法指令
SMULL R1,R2,R3,R4 ;R1=(R3*R4)的低32位,R2=(R3*R4)的高32位
21.SMLAL 64位带加数的有符号数乘法指令
SMLAL R2,R3,R7,R6 ; (R3,R2)=R7*R6+(R3,R2)
22.UMULL 无符号数长乘指令
UMULL R0,R1,R5,R8 ; (R1,R0)=R5*R8
23.UMLAL 无符号长乘-累加操作指令
UMLAL R0,R1,R5,R8 ; (R1,R0)=R5*R8+(R1,R0)
24.CLZ 零计数指令
该指令用于计算最高符号位和第一个1之间的0的个数。
25.MRS 用于将状态寄存器的内容传送到通用寄存器中
MRS{<cond>}<Rd>,CPSR
MRS{<cond>}<Rd>,SPSR
26.MSR 用于将通用寄存器的内容或者一个立即数传送到状态寄存器中
27.LDR 字数据读取指令
LDR指令用于从内存中将一个32位的字读取到指令中的目标寄存器。
LDR R0,[R1,#4] ; R0=R1+4
LDR R0,[R1,#-4] ; R0=R1-4
LDR R0,[R1,R2] ; R0=R1+R2
LDR R0,[R1,R2,LSL #2] ;R0=R1=4*R2
LDR R0,[R1,#4]! ; R0=R1+4,R1=R1+4
LDR R0,[R1,R2]! ; R0=R1+R2 ,R1=R1+R2
LDR R0,[R1,R2,LSL #2] ;R0=R1=4*R2,R1=R1=4*R2
LDR R0,[R1],#4 ; R0=R1,R1=R1+4
LDR R0,[R1],#R2 ; R0=R1,R1=R1+R2
LDR R0,[R1],R2,LSL #2 ; R0=R1,R1=R1+4*R2
28.LDRB 字节数据读取指令
LDRB将一个8位的诗句从内存读取到指令中的目标寄存器,并将寄存器的高24位清零。
LDRB R0,[R2,#3] ; 将内存(R2+3)中的字节数据读取到R0,RO中的高24位设置为0
29.LDRBT 用户模式的字节数据读取指令
LDRBT指令用于从内存中将一个8位的字节数据读取到指令中的目标寄存器,并将寄存器的高24位清零。
30.LDRH 半字节数据读取指令
LDRH指令用于从内存中将一个16位的半字节数据读取到指令的目标寄存器中,并将寄存器的高16位清零。
LDRH R0,[R1]; R0=R1,R0中高16位设置为0
31.LDRSB 有符号的字节数据读取指令
LDRSB 用于从内存中将一个8位的字节数据读取到指令中的目标寄存器中,并将寄存器的高24位设置成该字节数据的符号位的值(即将该8位字节数据进行符号位扩展,生成32位字节)
LDRR7,[R6,#-1]; 将内存单元(R6-1)中的有符号字节数据读取到R7中,R7中高24位设置成该字节书库的符号位,R6=R6-1
32.LDRSH 有符号的半字节数据读取指令
LDRSH R7,[R6,#2]! ;将内存单元(R6+2)中的字节数据读取到R7中,R0中高16位设置为该半字的符号位,R6=R6+2
33.LDRT 用户模式的字数据读取指令
LDRT指令用于从内存中将一个32位的字数据读取到指令中的目标寄存器中。
34.STR 字数据写入指令
STR指令将一个32位的字数据写入到指令中指定的内存单元。
STR R0,[R1],#8 ;将R0中的字数据保存到内存单元(R1)中,R1=R1+8
35.STRB 字节数据写入指令
STRB用于从寄存器中取出指定的8位字节数据放入到寄存器的低8位,并将寄存器的高位补零。
STRB R3,[R5,#0X200]! ;将R3中的低8位数据保存到内存单元(R5+0X200)中,R5=R5+0X200
36.STRH 半字节数据写入指令
STRH用于将一个16位的半字节数据写入到指令中指定的内存单元。
37.STRT 用户模式的字数据写入指令
STRT指令用于将一个32位的字数据写入到指定的内存单元。
38.STRBT 用户模式的字节数据写入指令
STRBT指令用于将一个8位的字节数据写入到指令中指定的内存单元。
39.LDM(1) 批量内存子数据读取指令
40.LDM(2) 用户模式的批量内存子数据读取指令
41.LDM(3) 带状态寄存器的批量内存字数据读取指令
42.STM(1) 批量内存字数据写入指令
43.STM(2) 用户模式的批量内存字数据写入指令
44.SWP 交换指令
SWP R1,R2,[R3] ;将内存单元(R3)中的字数据读取到R1,同时将R2寄存器的数据写入到内存单元(R3)中
SWP R1,R1,[R2] ; 将R1寄存器内容和内存单元(R2)的内容互换
45.SWPB 字节交换指令
SWPB R1,R2,[R3] ;将内存单元R3中字节数据读取到R1寄存器,R1的高24位为0,同时将R2寄存器的低8位写入R3中。
46.SWI 软中断指令
SWI 0X123456 ;产生软中断,中断立即数是0x123456
47.BKPT 断点中断指令
本指令主要是供软件调试程序使用。
48.CDP 协处理器数据操作指令
CDP P5,2,C12,C10,C3,4 ;对协处理器P5进行操作,第一个操作数是2,第二个操作数是4,目标寄存器是协处理器寄存器C12,源寄存器分别为协处理器的C10和C3
49.LDC 协处理器数据读取指令
LDC P6,CR4,[R2,#4] ; R2为ARM寄存器,指令读取内存单元(R2+4)的字数据,传送到协处理器P6的CR4寄存器。
50.STC 协处理器数据写入指令
STC P8,CR8,[R2,#4]! ; R2为ARM寄存器。指令将协处理器p8的CR48寄存器中的字数据写入到内存单元(R2+4)中,指令执行后R2=R2+4
51.MCR ARM寄存器到协处理器寄存器的数据传送指令
MCR P14,3,R7,C7,C11,6 ; 指令从ARM寄存器中将数据传送到协处理器P14,其中R7为ARM寄存器,存放源操作数;C7、C11是协处理器寄存器,为目标寄存器;操作码1为3,操作码2为6。
52.MRC 协处理器寄存器到ARM寄存器的数据传送指令
MRC P15,2,R5,C0,C2,4 ;指令将协处理器P15寄存器中的数据传送到ARM寄存器中,其中,R5为ARM寄存器,是目标寄存器;C0、C2是协处理器寄存器,存放源操作数,操作码1为2,操作码2为4.