ARM 指令集表格
arm常用指令

Arm常用指令一览表V1.1作者:李志勇指令功能实例注释Mov 给一个寄存器赋值Mov r0, #10Mov r0, r1R0 = 10R0 = r1Movt 给一个寄存器的高16位赋值Movt r0, #10Movt r0, r1把一个16位的op2放到r0的[31-16],r0的[15-0]不变注意:op2不能大于16位,但可以不符合立即数规则,如op2可以是0x1234,op1必须是可读可写的Mvn 把一个数值按位取反后赋值给一个寄存器Mvn r0,#0xffMvn r0, r1R0 = ~0xffR0 = ~r1Add 计算两个数值的加法Add r0,r0,#10Add r0,r0,r1R0 = r0 + 10R0 = r0 + r1Adc 带进位的加法Adc r0,r0,#10Adc r0,r0,r1R0 = r0 + 10 + CR0 = r0 + r1 + CSub 计算两个数值的减法Sub r0,r0, #10Sub r0, r0, r1R0 = r0 – 10R0 = r0 - r1Sbc 带借位的减法Sbc r0, r0, #10Sbc r0, r0, r1R0 = r0 – 10 - !CR0 = r0 – r1 - !CRsb 反转减法Rsb r0, r0, r1Rsb r0, r0, #10R0 = r1 – r0R0 = 10 - r0Rsc 带借位的反转减法Rsc r0, r0, r1Rsc r0, r0, #10R0 = r1 – r0 - !CR0 = 10 – r0 - !CMul 乘法Mul r0, r1, r2 R0 = r1 * r2Mla 乘加Mul r0, r1, r2, r3 R0 = r1 * r2 + r3Mls 乘减Mls r0, r1, r2, r3 R0 = r3 – r1 * r2Orr 按位或Orr r0, r0, r1Orr r0, r0, #10R0 = r0 | r1R0 = r0 | 10Eor 按位异或Eor r0, r0, #10Eor r0, r0, r1R0 = r0 ^ 10R0 = r0 ^ r1And 按位与And r0, r0, r1And r0, r0, #10R0 = r0 & r1R0 = r0 & 10Bic 位取反 Bic r0, r0, r1 Bic r0, r0, #10 R0 = r0 & (~r1) R0 = r0 & (~10) Lsr 逻辑右移 R0, lsr r1 R0, lsr #10 R0 >>> r1 R0 >>> 1 Lsl 逻辑左移 R0, lsl r1 R0, lsl #1 R0 <<< r1 R0 <<< 1 Asr 算术右移 R0, asr r1 R0, asr #1 R0 >> r1 R0 >> 1Ror 循环右移 R0, ror r1 R0, ror #1 (R0 >>> r1) | (R0 <<< (32 – r1)) (R0 >>> 1) | (R0 <<< (32 – 1)) Cmp 比较Cmp r0, r1 Cmp r0, #10 R0 – r1 影响cpsr 标志位 R0 – 10 影响cpsr 标志位 Teq 比较(按位异或) Teq r0, r1 Teq r0, #10 R0 ^ r1 影响cpsr 标志位 R0 ^ 10 影响cpsr 标志位 Tst 比较(按位与)Tst r0, r1 Tst r0, #10 R0 & r1 影响cpsr 标志位 R0 & 10 影响cpsr 标志位 Mrs 读cpsr Mrs r0, cpsr R0 = cpsr Msr 写cpsr Msr cpsr, r0 Cpsr = r0Swi 软中断 Swi 10 产生软中断异常 Svc 等同于swiSvc 10产生软中断异常 Ldr把数据从内存加载的寄存器Ldr r0, addr ldr r0, =addr ldr r1, [r0] ldr r1, [r0, #4] ldr r1, [r0, #4]! ldr r1, [r0], #4 R0 = *addr R0 = addr R1 = *r0R1 = *(r0 + 4)R1 = *(r0 + 4); r0 += 4 R1 = *r0; r0 += 4 Str 把数据从寄存器保存的内存Str r0, addr Str r1, [r0] Str r1, [r0, #4] Str r1, [r0, #4]! Str r1, [r0], #4*addr = r0 *r0 = r1*(r0 + 4) = r1*(r0 + 4) = r1; r0 += 4 *r0 = r1; r0 += 4Ldm 把数据从内存加载的寄存器 Ldmfd sp!, {r0-r12, lr} 把寄存器的值放到慢递减栈中 Stm把数据从寄存器保存的内存Stmfd sp!, {r0-r12, lr} 从慢递减栈中把值取到寄存器Push 压栈 Push {r0-r12, lr} 把寄存器的值放到慢递减栈中 Pop 出栈 Pop {r0-r12, lr} 从慢递减栈中把值取到寄存器 b 跳转B lable 跳到lable 处执行Bl 跳转并保存返回地址 Bl lable 保存下一条指令的地址到lr ,并跳转到lable 处执行 Bx 跳转(可切换状态)Bx r0跳转到r0所指的位置执行Clz 计算一个数值高位零的个数 Clz r0, r1计算r1中开头的零的个数,把计算结果放到r0 Qadd 饱和加法 Qadd r0, r0, r1 运算结果的饱和到[0x80000000,0x7fffffff]Qadd8 饱和8位加法 Qadd8 r0, r0, r1 r1和r2的每一个字节分别相加,饱和到[-2^7, 2^7-1] 注意:每一个操作数都是寄存器,不影响Q 位Qadd16 饱和16位加法 Qadd16 r0, r0, r1 r1和r2的每一个16位相加,饱和到[-2^15, 2^15-1] 注意:每一个操作数都是寄存器,不影响Q 位 Qsub 饱和减法Qsub r0, r0, r1 运算的结果饱和到[0x80000000,0x7fffffff]Qsub16 饱和16位减法 Qsub16 r0, r0, r1 r1和r2的每一个16位分别相减,饱和到[-2^15, 2^15-1] 注意:每一个操作数都是寄存器 ,不影响Q 位Qsub8 饱和8位减法 Qsub8 r0, r0, r1 r1和r2的每一个字节分别相减,饱和到[-2^7, 2^7-1] 注意:每一个操作数都是寄存器 ,不影响Q 位 Ssat有符号饱和Ssat r0, #sat, r11<=sat<=32把r1饱和到[-2^(sat-1), 2^(sat-1)-1],结果放到r0,如果饱和会置位Q注意:把r1饱和到sat 个位,饱和后符号不变 Ssat16 有符号16位饱和 Ssat16 r0, #sat, r11<=sat<=16把r1中的每一个16位饱和到[-2^(sat-1), 2^(sat-1)-1],结果放到r0,如果饱和会置位Q注意:把r1中的每一个16位饱和到sat 个位,饱和后符号不变 Usat 无符号饱和 Usat r0, #sat, r10<=sat<=31把r1饱和到[0, 2^sat-1],结果放到r0,如果饱和会置位Q 注意:负数饱和到0 Usat16 无符号16位饱和 Usat16 r0, #sat, r1usat16 r0,#sat,r1 0<=sat<=31把r1中的两个16位分别饱和到[0, 2^sat-1],结果放到r0,如果饱和会置位Q注意:负数饱和到0Rev大小端转换 Rev r0, r1把r1进行大小端转换,结果放到r0Rev16 16位大小端转换 Rev16 r0, r1 把r1的每个16位进行大小端转换,结果放到r0 Revsh 16位大小端转换并有符号扩展 Revsh r0, r1 把r1的低16位进行大小端转换,并扩展为一个32位的有符号数 Rbit 位反转 Rbit r0, r1 把r1进行位顺序翻转,结果放到r0 Uxtb16 无符号8位扩展16位 Uxtb16 r0,r1 把r1中的两个8位数无符号扩展为两个16位数,结果放到r0 Uxtb 无符号8位扩展32位 Uxtb8 r0,r1 把r1中的8位数无符号扩展为一个32位数,结果放到r0 Uxth 无符号16位扩展32位 Uxth r0,r1 把r1中的16位数无符号扩展为一个32位数,结果放到r0 Sxtb16 有符号8位扩展16位 Sxtb16 r0,r1 把r1中的两个8位数有符号扩展为两个16位数,结果放到r0 Sxtb 有符号8位扩展32位 Sxtb8 r0,r1 把r1中的8位数有符号扩展为一个32位数,结果放到r0 Sxth 有符号16位扩展32位 Sxth r0,r1 把r1中的16位数有符号扩展为一个32位数,结果放到r0注意:这里并不是arm 指令集的全部,只是arm 指令集中比较常用的指令,如想查看全部指令集,请到arm 官方网站自行下载:。
常用ARM指令汇总

常用ARM指令集及汇编一、ARM处理器的寻址方式二、指令集学习(一)ARM指令集1.指令格式2.条件码3.ARM存储器访问指令1)LDR/ STR-加载/ 存储指令2)LDM/ STM-多寄存器加载/ 存储指令3)SWP-寄存器和存储器交换指令4.ARM数据处理指令1)数据传送指令a)MOV-数据传送指令b)MVN-数据非传送指令2)算术逻辑运算指令a)ADD-加法运算指令b)SUB-减法运算指令c)RSB-逆向减法指令d)ADC-带进位加法指令e)SBC-带进位减法指令f)RSC-带进位逆向减法指令g)AND-逻辑“与”h)ORR-逻辑“或”i)EOR-逻辑“异或”j)BIC-位清除指令3)比较指令a)CMP-比较指令b)CMN-负数比较指令c)TST-位测试指令d)TEQ-相等测试指令4)乘法指令a)MUL-32位乘法指令b)MLA-32位乘加指令c)UMULL-64位无符号乘法指令d)UMLAL-64位无符号乘加指令e)SMULL-64位有符号乘法指令f)SMLAL-64位有符号乘加指令5.ARM分支指令1)B-分支指令2)BL-带连接的分支指令3)BX-带状态切换的分支指令6.ARM协处理器指令1)CDP-协处理器数据操作指令2)LDC-协处理器数据读取指令3)STC-协处理器数据写入指令4)MCR-ARM处理器到协处理器的数据传送指令5)MRC-协处理器到ARM处理器的数据传送指令7.ARM杂项指令1)SWI-软中断指令2)MRS-读状态寄存器指令3)MSR-写状态寄存器指令8.ARM伪指令1)ADR-小范围的地址读取伪指令2)ADRL-中等范围的地址读取伪指令3)LDR-大范围的地址读取伪指令4)NOP-空操作伪指令(二)Thumb指令集1.Thumb指令集和ARM指令集的区别2.Thumb存储器访问指令1)LDR/ STR-加载/ 存储指令2)PUSH/ POP-寄存器入栈 / 出栈指令3)LDMIA/ STMIA-多寄存器加载/ 存储指令3.Thumb数据处理指令1)数据传送指令a)MOV-数据传送指令b)MVN-数据非传送指令c)NEG-数据取负指令2)算术逻辑运算指令a)ADD-加法运算指令b)SUB-减法运算指令c)ADC-带进位加法指令d)SBC-带进位减法指令e)MUL-乘法运算指令f)AND-逻辑“与”g)ORR-逻辑“或”h)EOR-逻辑“异或”i)BIC-位清除指令j)ASR-算术右移指令k)LSL-逻辑左移指令l)LSR-逻辑右移指令m)ROR-循环右移指令3)比较指令a)CMP-比较指令b)CMN-负数比较指令c)TST-位测试指令4.Thumb分支指令1)B-分支指令2)BL-带连接的分支指令3)BX-带状态切换的分支指令5.Thumb杂项指令1)SWI-软中断指令6.Thumb伪指令1)ADR-小范围的地址读取伪指令2)LDR-大范围的地址读取伪指令3)NOP-空操作伪指令。
04.1 ARM指令集

Rm[32-shift_imm]的值。举例如下:
MOV MOV R3,#30 R4,R3,LSL #0x12
则寄存器R4的值为0x00780000。
Softeem Consultancy Service
(2)<Rm>,LSL <Rs> 指令的操作数shifter_operand为寄存器Rm的数值逻辑左移一定位数的值, 移位的位数由Rs寄存器的最低8位Rs[7:0]决定。当Rs[7:0]=0时, shifter_operand的值就是Rm的值,循环器的进位值(Carry-out)为CPSR 中的C标志位;当0<Rs[7:0]<32时,shifter_operand的值为Rm中值逻辑 左移Rs[7:0]位后的值,循环器的进位值为Rm寄存器中最后被移出的位
状态寄存器传送指令、Load/Store指令、协处理器指令和 异常产生指令。本章按指令系统的基本分类方法,分三大部
分(即运算、传送和控制)分ultancy Service
目录 寄存器的寻址方式
1 2 3 4 5 6 7 8 9 寄存器寻址 立即寻址 寄存器偏移寻址 寄存器间接寻址 基址寻址 多寄存器寻址 堆栈寻址 块拷贝寻址 相对寻址
Softeem Consultancy Service
(1)<Rm>,LSL #<shift_imm> 指令的操作数shifter_operand为寄存器Rm的数值逻辑左移shift_imm位。 这里shift_imm的范围为0~31。如果shift_imm为0,则shifter_operand的 值就是Rm的值,循环器的进位值(Carry-out)为CPSR中的C标志位; 如果shift_imm不为零,则shifter_operand 的值为Rm中值逻辑左移 shift_imm位后的值,循环器的进位值为Rm寄存器中最后被移出的位
ARM7指令集.ppt

r3
r1
r2
ARM是三地址指令格式,指令的基本格式如下:
<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}
其中<>号内的项是必须的,{}号内的项是可选的。 各项的说明如下: opcode:指令助记符; cond:执行条件;
S:是否影响CPSR寄存器的值;
Rd:目标寄存器;
0x00
0x00
0x00
0x12
8位常数
00000100100000000000000000000000
0x04
0x80
0x00
0x00
4.2 指令集介绍
arm数据处理指令指令编码opcode操作码功能表指令执行的条件码i用于区别立即数i为1和寄存器移位i为0opcode数据处理指令操作码第二操作数说明rd目标寄存器加法运算指令rn第一操作数寄存器带进位加法带进位减法指令s设置条件码与指令中的s位对应位测试指令adc0101sbc0110带进位逆向减法指令rsc0111tst1000相等测试指令teq1001比较指令cmp1010负数比较指令cmn1011逻辑或操作指令orr1100数据传送mov1101位清除指令bic1110数据非传送mvn1111add0100逆向减法指令rsb0011减法运算指令sub0010逻辑异或操作指令eor0001逻辑与操作指令and0000指令助记符操作码助记符说明操作条件码位置movrdoperand2数据传送rdoperand2movcondsmvnrdoperand2数据非传送rdoperand2mvncondsarm数据处理指令数据传送注
LDR R0,[R1,R2] ;R0=[R1+R2]
ARM指令集速查

ARM®和 Thumb®-2 指令集快速参考卡表关键字Rm {, <opsh>}请参阅表寄存器,可选择移动常数个位<reglist>以逗号隔开的寄存器列表,括在大括号 { 和 } 内。
<Operand2>请参阅表灵活的操作数 2。
移位和循环移位只可用于 Operand2。
<reglist-PC>作为<reglist>,不能包含 PC。
<fields>请参阅表PSR 字段。
<reglist+PC>作为<reglist>,包含 PC。
<PSR>APSR(应用程序状态寄存器)、CPSR(当前处理器状态寄存器)或 SPSR(保存的处理器状态寄存器)<flags>nzcvq(ALU 标记 PSR[31:27])或g(SIMD GE 标记 PSR[19:16])C*,V*在体系结构 v4 及更早版本中,标记不可预知;在体系结构 v5 及以后版本中,标记保持不变。
§请参阅表ARM 体系结构版本。
<Rs|sh>可为 Rs 或一个立即数移位值。
每种移位类型的允许值与+/-+ 或 –。
(+ 可省略。
)表寄存器,可选择移动常数个位中的相同。
<iflags>中断标记。
一个或多个a、i、f(中止、中断、快速中断)。
x、y B 或 T,B 表示半寄存器 [15:0],T 表示半寄存器 [31:16]。
<p_mode>请参阅表处理器模式<imm8m>ARM:32 位常数,由 8 位值向右循环移偶数位生成。
SPm<p_mode>所指定的处理模式的 SPThumb: 32 位常数,由 8 位值左移任意位生成,<lsb>位域的最低有效位。
格式模式为 0xXYXYXYXY、0x00XY00XY 或 0xXY00XY00。
ARM汇编指令列表

ARM汇编伪指令ARM条件码CPSR位[31:24]为条件位域,用f表示;位[23:16]为状态位域,用s表示;位[15:8] 为扩展位域,用x表示;位[7:0] 为控制位域,用c表示;与指令MSR相关关于移位中断向量表APCS寄存器使用约定Load and Store指令LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2] !;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,#8] !;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址 R1+8写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址 R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器 R0,并将R0的高24 位清零。
LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将 R0的高24位清零。
LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器 R0,并将R0的高16位清零。
LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0 的高16位清零。
LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将 R0的高16位清零。
ARM指令集

条件码
MUL{Cond}{S} MLA{cond}{S} UMULL{cond}{S}
MUL MLA
Rd,Rm,Rs Rd,Rm,Rs,Rn
UMULL RdLo,RdHi,Rm,Rs UMLAL RdLo,RdHi,Rm,Rs SMULL RdLo,RdHi,Rm,Rs SMLAL RdLo,RdHi,Rm,Rs
ARM指令集
Ø Ø Ø Ø Ø Ø
数据处理指令; 跳转指令; Load/Store指令; 程序状态寄存器指令; 协处理器指令; 软件中断指令
1
5.3.3 数据处理指令
n
ARM数据处理指令大致分为以下6种类 型。
n n n n n n
数据传送指令 算术运算指令 逻辑运算指令 比较指令 测试指令 乘法指令
乘法指令
n
ARM7TDMI(-S)具有32×32乘法指令、32×32乘加指 令,32×32结果为64位的乘/乘加指令。ARM乘法指 令如下表所列。
助记符 说 明
32位乘法指令 32位乘加指令 64位无符号乘法指令 64位无符号乘加指令 64位有符号乘法指令 64位有符号乘加指令
操 作
Rd+Rm×Rs (Rd!=(Rm) Rd←Rm×Rs+Rn (Rd!=Rm) (RdLo,RdHi)←Rm×Rs
EOR Rd , Rn , 逻辑“异或”操作指 Rd←Rn^operand2 operand2 令 BIC Rd,Rn,operand2 位清除指令 CMP Rn,operand2 CMN Rn,operand2 TST Rn,operand2 TEQ Rn,operand2 比较指令 负数比较指令 位测试指令 相等测试指令 Rd←Rn&(~operand2) 标志N,Z,C,V←Rn-operand2 标志N,Z,C,V ←Rn+operand2 标志N,Z,C,V ←Rn&operand2 标志N,Z,C,V ←Rn^operand2
ARM指令大全

ARM指令集详解ARM可以用两套指令集:ARM指令集和Thumb指令集。
本文介绍ARM指令集。
在介绍ARM指令集之前,先介绍指令的格式。
1 指令格式(1)基本格式<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。
opcode 指令助记符,如LDR,STR 等cond 执行条件,如EQ,NE 等S 是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响Rd 目标寄存器Rn 第一个操作数的寄存器operand2 第二个操作数指令格式举例如下:LDR R0,[R1] ;读取R1 地址上的存储器单元内容,执行条件ALBEQ DATAEVEN ;跳转指令,执行条件EQ,即相等跳转到DATAEVENADDS R1,R1,#1 ;加法指令,R1+1=R1 影响CPSR 寄存器,带有SSUBNES R1,R1,#0xD;条件执行减法运算(NE),R1-0xD=>R1,影响CPSR 寄存器,带有S(2)第2个操作数在ARM 指令中,灵活的使用第2个操作数能提高代码效率,第2个操作数的形式如下:#immed_8r常数表达式,该常数必须对应8 位位图,即常数是由一个8 位的常数循环移位偶数位得到。
合法常量0x3FC、0、0xF0000000、200、0xF0000001等都是合法常量。
非法常量0x1FE、511、0xFFFF、0x1010、0xF0000010等都是非法常量。
常数表达式应用举例如下:MOV R0,#1 ;R0=1AND R1,R2,#0x0F ;R2 与0x0F,结果保存在R1LDR R0,[R1],#-4 ;读取R1 地址上的存储器单元内容,且R1=R1-4Rm寄存器方式,在寄存器方式下操作数即为寄存器的数值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
同STR指令,但无论指令处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作
LDM批量数据加载指令
LDM{<cond>}{type} <Rn>{!},<reg>{^}
从一片连续的内存单元读取数据到各个寄存器中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示
CMP比较指令
CMP{<cond>} <Rn>,<op1>
将寄存器Rn的值和操作op1所表示的值进行比较,根据结果更新CPSR中条件标志位的值
CMP R0,#5 ;计算R0-5,根据结果设置条件标志位
CMN反值比较指令
CMN{<cond>} <Rn>,<op1>
同CMP指令,但寄存器Rn的值是和op1取反的值进行比较
Rd=op2-Rn-!carry
RSC R1,R5,R3 ;高32位相减
MUL 32位乘法指令
gt;,<op2>
Rd=Rn*op2
MULS R0,R1,R2 ;R0=R1*R2
MLA 32位乘法指令
MLA{<cond>}{S} <Rd>,<Rn>,<op2>,<op3>
B exit;跳转到标号exit处
BL带返回的跳转指令
BL{<cond>} <addr>
同B指令,但BL指令执行跳转操作的同时,还将PC的值保存到LR寄存器中
BL func;调用子程序func
BLX带返回和状态切换的跳转指令
BLX <addr>或BLX <Rn>
处理器跳转到目的地址处,从那继续执行,并将Pc的值保存到LR寄存器中
MSR CPSR_f,R0 ;用R0的值修改CPSR的条件标志位
5、协处理器指令
指令
格式
功能
举例
CDP协处理器数据操作指令
CDP{<cond>} <p>,<opcode1>,<CRd>,<CRm>,<CRn>,<opcode2>
用于传送指令给协处理器p,要求其在寄存器CRn和CRm上进行操作opcode1,并把结果存放到CRd中
SWPB字节数据交换指令
SWP{<cond>}B <Rd>,<op1>,[<op2>]
从op2所表示的内存装载一个字节并把这个字节放置到目的寄存器Rd的低8位中,Rd的高24位设置为0,然后将寄存器op1的低8位数据存储到同一内存地址中
4、程序状态寄存器指令
指令
格式
功能
举例
MRS程序状态寄存器到通用寄存器的数据传送
ADC{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn+op2+carry
ADDS R0,R2,R4;低32位相加,S表示结果影响条件标志位的值
SUB减法指令
SUB{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn-op2
SUB R0,R1,#5;R0=R1-5
RSB反向减法指令
EOR逻辑异或指令
EOR{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn EOR op2
EOR R0,R0,#5 ;R0的第0位和第2位取反,其余位不变
BIC位清除指令
BIC{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn AND (!op2)
BIC R0,R0,#5 ;R0的第0位和第2位清零,其余位不变
同LDR指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作
STR字数据存储指令
STR{<cond>} <Rd>,<addr>
把寄存器Rd中的字数据(32位)保存到addr所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器
STR Rd,[Rn] ;存储Rd到Rn所包含的有效内存地址单元中
SMLAL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>
Rdh Rdl=Rn*op2+Rdh Rdl
SMLAL R2,R3,R7,R6 ;(R3,R2)=R7*R6+(R3,R2)
UMULL 64位无符号数乘法指令
UMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>
BLX T16;跳转到标号T16处,T16后面的指令是thumb指令
BX带状态切换的跳转指令
BX <Rn>
处理器跳转到目的地址处,从那继续执行;目标地址为寄存器Rn的值和0xFFFFFFFE进行与操作的结果
ADR R0,exit ;标号exit处的地址装入R0中BX R0;跳转到exit处,并根据R0的最低位来切换处理器状态
AND逻辑与指令
AND{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn AND op2
AND R0,R0,#5 ;保持R0的第0位和第2位,其余位清零
ORR逻辑或指令
ORR{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn OR op2
ORR R0,R0,#5 ;R0的第0位和第2位设置为1,其余位不变
STM批量数据存储指令
STM{<cond>}{<type>} <Rn>{!},<reg>{^}
将各个寄存器的值存入一片连续的内存单元中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示
SWP字数据交换指令
SWP{<cond>} <Rd>,<op1>,[<op2>]
Rd=[op2],[op2]=op1
STC协处理器数据存储指令
STC{<cond>}{L} <p>,<CRd>,<addr>
将寄存器CRd的值传送到addr表示的内存地址中
STC p5,c1,[R1+5] ;将协处理器p5中寄存器c1的数据传送到R1+5所对应的存储单元中
MCR ARM寄存器到协处理器寄存器的数据传送指令
MCR{<cond>} <p>,<op1>,<Rd>,<CRn>,<CRm>,{op2}
将寄存器Rn的值和操作op1所表示的值按位进行逻辑异或操作,根据结果更新CPSR中条件标志位的值,但不存储结果
TEQ R0,R1 ;比较R0与R1是否相等
2、跳转指令
指令
格式
功能
举例
B跳转指令
B{<cond>} <addr>
一旦遇到B指令,ARM处理器将立即跳转到给定的地址addr,从哪里继续执行。
STRB字节数据存储指令
STR{<cond>}B <Rd>,<addr>
将寄存器Rd中的低8位字节数据保存到addr所表示的内存地址中
STRB R0,[R1];将寄存器R0中的低8位数据存入R1表示的内存地址中
STRBT用户模式的字节数据存储指令
STR{<cond>}BT <Rd>,<addr>
同STRB指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作
STRH半字数据存储指令
STR{<cond>}H <Rd>,<addr>
将寄存器Rd中的低16位半字数据保存到addr所表示的内存地址中,而且addr所表示的地址必须是半字对齐的
STRH R0,[R1] ;将寄存器R0中的低16位数据存入R1表示的内存地址低有效半字中
STRT用户模式的字数据存储指令
MVN数据取反传送指令
MVN{<cond>}{S} <Rd>,<op1>
Rd=!op1
MVN R1,R2;将R2按位取反结果存到R1
ADD加法指令
ADD{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn+op2
ADD R0,R1,R2,LSL#5;R0=R1+R2左移5位
ADC带进位加法指令
LDR{<cond>}B <Rd>,<addr>
同LDR指令,但该指令只是从内存读取一个8位的字节数据而不是一个32位的字数据,并将Rd的高24位清零
LDRB R0,[R0] ;将内存中起始地址为R1的一个字节数据装入R0中
LDRBT用户模式的字节数据加载指令
LDR{<cond>}BT <Rd>,<addr>
ARM指令集
ARM指令集由数据处理指令、跳转指令、Load/Store指令、程序状态寄存器指令、协处理器指令和软件中断指令六大类构成。