数据传送指令 |
|
MOV |
MOV R1,#0x6 ;R1=0x6 MOV R0,R1 ;R0=R1 MOV R3,R1,LSL #2 ;R3=R1<<2 MOV R3,R1,LSL R2 ;R3=R1<<R2 数据传送指令 |
MVN |
MVN R1,#0x6 ;R1=~0x6 MVN R0,R1 ;R0=~R1 MVN R3,R1,LSL #2 ;R3=~(R1<<2) MVN R3,R1,LSL R2 ;R3=~(R1<<R2) 数据求反传送指令 |
算术指令 |
|
ADD |
ADD R1,R1,#0x6 ;R1=R1 + 0x6 ADD R1,R1,R2 ;R1=R1 + R2 ADD R3,R1,R2,LSL #2 ;R3=R1 + R2<<2 ADD R3,R1,R2,LSL R6 ;R3=R1 + R2<<R6 加法指令 |
ADC |
ADC R1,R1,#0x6 ;R1=R1 + 0x6 + C ADC R1,R1,R2 ;R1=R1 + R2 + C ADC R3,R1,R2,LSL #2 ;R3=R1 + R2<<2 + C ADC R3,R1,R2,LSL R6 ;R3=R1 + R2<<R6 + C 带进位加法指令 注:因为是带进位的,所以还要加上CPSR中的C条件标志位的值 |
SUB |
SUB R1,R1,#0x6 ;R1=R1 - 0x6 SUB R1,R1,R2 ;R1=R1 - R2 SUB R3,R1,R2,LSL #2 ;R3=R1 - R2<<2 SUB R3,R1,R2,LSL R6 ;R3=R1 - R2<<R6 减法指令 |
SBC |
SBC R1,R1,#0x6 ;R1=R1 - 0x6 - !C SBC R1,R1,R2 ;R1=R1 - R2 - !C SBC R3,R1,R2,LSL #2 ;R3=R1 - R2<<2 - !C SBC R3,R1,R2,LSL R6 ;R3=R1 - R2<<R6 - !C 带借位的减法指令 注:因为是带借位的,所以还要再减去CPSR中的C条件标志位的反码 |
RSB |
RSB R1,R1,#0x6 ;R1=0x6 - R1 RSB R1,R1,R2 ;R1=R2 - R1 RSB R3,R1,R2,LSL #2 ;R3=R2<<2 – R1 RSB R3,R1,R2,LSL R6 ;R3=R2<<R6 – R1 逆向减法指令 |
RSC |
RSC R1,R1,#0x6 ;R1=0x6 – R1 - !C RSC R1,R1,R2 ;R1=R2 - R1 - !C RSC R3,R1,R2,LSL #2 ;R3=R2<<2 - R1 - !C RSC R3,R1,R2,LSL R6 ;R3=R2<<R6 - R1 - !C 带借位的逆向减法指令 注:因为是带借位的,所以还要再减去CPSR中的C条件标志位的反码 |
逻辑指令 |
|
AND |
AND R1,R1,#0x6 ;R1=R1 & 0x6 AND R1,R1,R2 ;R1=R1 & R2 AND R3,R1,R2,LSL #2 ;R3=R1 & (R2<<2) AND R3,R1,R2,LSL R6 ;R3=R1 & (R2<<R6) 逻辑与指令 |
ORR |
ORR R1,R1,#0x6 ;R1=R1 || 0x6 ORR R1,R1,R2 ;R1=R1 || R2 ORR R3,R1,R2,LSL #2 ;R3=R1 || (R2<<2) ORR R3,R1,R2,LSL R6 ;R3=R1 || (R2<<R6) 逻辑或 |
EOR |
EOR R1,R1,#0x6 ;R1=R1 ^ 0x6 EOR R1,R1,R2 ;R1=R1 ^ R2 EOR R3,R1,R2,LSL #2 ;R3=R1 ^ (R2<<2) EOR R3,R1,R2,LSL R6 ;R3=R1 ^ (R2<<R6) 逻辑异或指令 |
BIC |
BIC R1,R1,#0xF ;将R1的低4位清零 BIC R1,R1,R2 ;将R2的反码与R1逻辑与,结果保存到R1 BIC R3,R1,R2,LSL #2 BIC R3,R1,R2,LSL R6 位清除指令 注:将第一个源操作数的位清零,清零的位是最后一个操作数中所有为1的位 |
比较指令 |
|
CMP |
CMP R1,#10 ;R1与10比较,设置相关标志位 CMP R1,R2 ;R1与R2比较,设置相关标志位 CMP R1,R2,LSL #6 ; R2左移6位后与R1比较,设置相关标志位 CMP R1,R2,LSL R3 ; R2左移R3位后与R1比较,设置相关标志位 比较指令 CMP{cond} Rn,operand2 注:指令使用寄存器Rn的值减去operand2的值,根据操作的结果理新CPSR 中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行 在进行两个数据大小判 断时,常用CMP指令及相应的条件码来操作 |
CMN |
CMN R1,#10 ;R1与10比较,设置相关标志位 CMN R1,R2 ;R1与R2比较,设置相关标志位 CMN R1,R2,LSL #6 ; R2左移6位后与R1比较,设置相关标志位 CMN R1,R2,LSL R3 ; R2左移R3位后与R1比较,设置相关标志位 比较指令 CMN{cond} Rn,operand2 注:指令使用寄存器Rn的值加上operand2的值,根据操作的结果理新CPSR 中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行 |
TST |
TST R1,#0x0F ;判断R1的低4位是否为0 TST R1,R2 TST R1,R2,LSL #6 TST R1,R2,LSL R3 位测试指令 指令将寄存器Rn的值与operand2的值按位作逻辑与操作 当所有测试位均为0时,EQ有效,而只要有一个测试为不为0,则NE有 效. |
TEQ |
TEQ R1,#0x0F ;判断R1的低4位是否为0 TEQ R1,R2 TEQ R1,R2,LSL #6 TEQ R1,R2,LSL R3 相等测试指令 指令寄存器Rn的值与operand2的值按位作逻辑异或操作,根据操作 的结果理新CPSR中相应条件标志位 常与EQ,NE条件码配合使用,当两个数据相等时,EQ有效,否则NE有效 |
乘法指令 |
|
MUL |
MUL R1,R2,R3 ;R1=R2×R3 32位乘法指令 |
UMULL |
UMULL R0,R1,R5,R8 ;(R1、R0)=R5×R8 64位无符号乘法指令 相乘后,高32位在R1中,低32位在R0中 |
SMULL
|
SMULL R2,R3,R7,R6 ;(R3,R2)=R7×R6 64位有符号乘法指令 |
MLA |
MLA R1,R2,R3,R0 ;R1=R2×R3+R0 32位乘加指令. 指令将Rm和Rs中的值相乘,再将乘积加上第3个操作数,结果的低 |
UMLAL |
UMLAL R0,R1,R5,R8 ;(R1,R0)=R5×R8+(R1,R0) 64 位无符号乘加指令. UMLAL{cond}{S} RdLo,RdHi,Rm,Rs 指令将Rm 和Rs 中的值作无符号数相乘,64 位乘积与 RdHi,RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中 |
SMLAL |
SMLAL R2,R3,R7,R6 ;(R3,R2)=R7×R6+(R3,R2) 64 位有符号乘加指令 |
杂类算数指令
|
|
CLZ
|
CLZ R1,R2 ;R1中存放R2中操作数最高端0的个数
前导0个数计数指令
|
(三)Load/Store指令
Load指令 |
|
LDR |
LDR R1,[R0,#0x12] ;将R0+0x12地址处的数据读出,保存到R1中(R0的值不变) LDR R1,[R0,R2] ;将R0+R2地址的数据计读出,保存到R1中(R0的值不变) LDR R1,[R0,-R2,LSL #2] ;将R0-R2*4地址处的数据计读出,保存到R1中(R0,R2的值不变) LDR R1,[R0,#0x12]! ;将R0+0x12地址处的数据读出,保存到R1中(R0= R0+0x12) LDR R1,[R0,R2]! ;将R0+R2地址的数据计读出,保存到R1中(R0= R0+R2) LDR R1,[R0,-R2,LSL #2]!;将R0-R2*4地址处的数据计读出,保存到R1中(R0= R0-R2*4) LDR R1,[R0],#0x12 ;将R0地址处的数据读出,保存到R1中(R0= R0+0x12) LDR R1,[R0],R2 ;将R0+R2地址的数据计读出,保存到R1中(R0= R0+R2) LDR R1,[R0],R2,LSL #0x12 ;将R0地址处的数据计读出,保存到R1中(R0= R0-R2*4) LDR R1,Lable ;将Lable标号地址里的值保存到R1中 字数据读取指令 |
LDRB |
与上述指令相同,只不过是针对一个字节大小的加载,目标寄存器的最低字节有效,高24位清零 字节数据读取指令 |
LDRH |
与上述指令相同,只不过是针对半字大小的加载,目标寄存器的最低16位有效,高16位清零 半字节数据读取指令 |
LDRSB |
与上述指令相同,只不过是针对一个字节大小的加载,且是有符号的,目标寄存器的最低字节有效,高24位设置成该字节数据的符号位的值 有符号的字节读取指令 |
LDRSH |
与上述指令相同,只不过是针对半字大小的加载,且是有符号的,目标寄存器的低16位有效,高16位设置成该字节数据的符号位的值 有符号的半字数据读取指令 |
LDRT |
T为可选后缀,若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看成是处理器是在用户模式下.T在用户模式下无效,不能与前索引偏移一起使用T。 前索引: LDR Rd,[Rn,#0x06]! LDR Rd,[Rn,#-0x06] 用户模式的字数据读取指令 |
LDRBT |
T为可选后缀,若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看成是处理器是在用户模式下.T在用户模式下无效,不能与前索引偏移一起使用T。 前索引: LDR Rd,[Rn,#0x06]! LDR Rd,[Rn,#-0x06] 用户模式的字节数据读取指令 |
Store指令 |
|
STR |
STR R1,[R0,#0x12] ;将R1中的数据存储到R0+0x12地址中,(R0的值不变) STR R1,[R0,R2] ;将R1中的数据存储到R0+R2地址中,(R0的值不变) STR R1,[R0,-R2,LSL #2] ;将R1中的数据存储到R0-R2*4地址中,(R0,R2的值不变) STR R1,[R0,#0x12]! ;将R1中的数据存储到R0+0x12地址中, (R0= R0+0x12) STR R1,[R0,R2]! ;将R1中的数据存储到R0+R2地址中, (R0= R0+R2) STR R1,[R0,-R2,LSL #2]! ;将R1中的数据存储到R0-R2*4地址中,(R0= R0-R2*4) STR R1,[R0],#0x12 ;将R1中的数据存储到R0地址中, (R0= R0+0x12) STR R1,[R0],R2 ;将R1中的数据存储到R0地址中, (R0= R0+R2) STR R1,[R0],R2,LSL #0x12 ;将R1中的数据存储到R0地址中, (R0= R0-R2*4) 字数据存储指令 |
STRB |
与上述指令相同,只不过是针对一个字节大小的存储,该字节数据为指令中存放源操作数的寄存器的低8位 字节数据存储指令 |
STRH |
与上述指令相同,只不过是针对半字大小的存储,该半字数据为指令中存放源操作数的寄存器的低16位 字节数据存储指令 |
STRT |
T为可选后缀,若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看成是处理器是在用户模式下.T在用户模式下无效,不能与前索引偏移一起使用T。 前索引: STR Rd,[Rn,#0x06]! STR Rd,[Rn,#-0x06] 用户模式的字数据存储指令 |
STRBT |
T为可选后缀,若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看成是处理器是在用户模式下.T在用户模式下无效,不能与前索引偏移一起使用T。 前索引: STR Rd,[Rn,#0x06]! STR Rd,[Rn,#-0x06] 用户模式的字节数据存储指令 |
(四)批量Load/Store指令
LDMIA R0!,{R3-R9} ;加载R0指向的地址上的多字数据,保存到R3~R9中,R0值更新
STMIA R1!,{R3-R9} ;将R3~R9的数据存储到R1指向的地址上,R1值更新
STMFD SP!,{R0-R7,LR};现场保存,将R0~R7、LR入栈
LDMFD SP!,{R0-R7,PC}^;恢复现场,异常处理返回,同时将SPSR的值复制到CPSR中 MRS |
MRS R1,CPSR MRS R2,SPSR 将状态寄存器CPSR或SPSR的值传送到通用寄存器中 |
MSR |
格式: MSR{cond} psr_fields,#immed_8r MSR{cond} psr_fields,Rm fields 指定传送的区域.Fields可以是以下的一种或多种(字母必须为小写): c 控制域屏蔽字节(psr[7…0]) x 扩展域屏蔽字节(psr[15…8]) s 状态域屏蔽字节(psr[23.…16]) f 标志域屏蔽字节(psr[31…24])
immed_8r 要传送到状态寄存器指定域的立即数,8位. Rm 要传送到状态寄存器指定域的数据的源寄存器. 例: MSR CPSR_c,#0xD3 ;CPSR[7…0]=0xD3,即切换到管理模式. MSR CPSR_cxsf,R3 ;CPSR=R3 可以直接设置状态寄存器CPSR或SPSR |
SWP |
SWP R1,R1,[R0] ;将R1的内容与R0指向的存储单元的内容进行交换 交换指令 |
SWPB |
SWP R1,R2,,[R0] ;将R0指向的存储单元内容读取一字节数据到R1中(高24位清零),并将R2的低8位写入到该内存单元(R0)中 字节交换指令 |
MOV R0,#34 ;设置了功能号为34SWI 12 ;调用12号软中断
MOV R0,#12 ;调用12号软中断MOV R1,#34 ;设置子功能号为34SWI 0