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寄存器方式,在寄存器方式下操作数即为寄存器的数值。
ARM速查指令集 全
ARM速查指令集(快速查找)
在本文档的汇编语法中,用 # 前缀表示立即值,用 & 表示十六进制值,用 % 表示二进制值,用 {花括号} 表示指令中可选的设置字段或位。
下面表格中粗体的指令是核心 ARM 指令,其他的是值得包含的位和片段、移位选项和汇编器助记码(mnemonic)... 还列出了协处理器指令。
但是用于 RISC OS 机器的 ARM 处理器不支持协处理器,只在一个可访问的芯片中提供了实际上的协处理器功能。
其中包括设置 ARM、cache、MMU 的设施,等...
RISC OS 的 BASIC 汇编器的伪指令
浮点指令指令索引。
ARM指令集详解
用于返回到调用代码,方法是把连接存放器的内容传送 到 R15: • MOV PC, R14 ; 退出到调用者 • MOVS PC, R14 ; 退出到精调品P用PT 者并恢复标志位
目的存放器中。操作数 Rn 是一个存放器,操作 数 op_2可以是一个存放器,被移位的存放器, 或一个立即值:
• RSB R0, R1, R2 ; R0 = R2 - R1
• RSB R0, R1, #256 ; R0 = 256 - R1
• RSB R0, R2, R3,LSL #1 ; R0 = (R3 << 1) - R2
• CMP R1,R2
• MOVNE R0,#0xff
精品PPT
比较指令
• CMN : 比较取负的值 • CMN{条件}{P} <op 1>, <op 2> • status = op_1 - (- op_2) • CMN 同于 CMP,但它允许你与小负值(操作数
2 的取负的值)进行比较,与 -1 比较将使用: • CMN R0, #1 ; 把 R0 与 -1 进行比较
• ADDS R0, R4, R8 ; 加低端的字
• ADCS R1, R5, R9 ; 加下一个字,带进位
• ADCS R2, R6, R10 ; 加第三个字,带进位
• ADCS R3, R7, R11 ; 加高端的字,带进位 如果要做这 样的加法,不要忘记设置 S 后缀来更改进位标志。
精品PPT
• TST R0, #0x3F8 精品PPT
测试指令
• TEQ{条件}{P} <op 1>, <op 2> • Status = op_1 EOR op_2 • TEQ 类似于 TST。区别是 EOR 而不是 AND。
ARM及THUMB指令集
loop
… SUBS r1,r1,#1
R1减1,并设置标志位
BNE loop
如果 Z标志清零则跳转
ARM及Thumb指令集
TM
4
4
Condition Codes
下表为所有可能的条件码:
注意:AL为默认状态,不需要单独指出
Suffix
EQ NE CS/HS CC/LO MI PL VS VC HI LS GE LT GT LE AL
位循环
RRX: Rotate Right Extended
Destination
CF
位轮换,从 CF到MSB都参与操作
ARM及Thumb指令集
TM
9
9
寄存器, 可选择是否增加移位操作. 移位值可以是:
5 bit 无符号整数 放在另一个寄存器的低字节
用于常数乘法
立即数 8 bit ,大小范围0-255。
ARM及Thumb指令集
TM
0
0x22
地址增加
r0
0x11
20
20
块数据传送
LDM / STM指令允许一次传送1到16个寄存器到/从存储器中。 寄存器传送顺序不能被指定 • 最小数字的寄存器总是被传送到/从存储器的最低地址上。 LDMIA r10,{r0,r1,r4}
新建一个 text文件 另存为 “gcd.s” 加入到项目中
Build 并执行
AREA myarea, CODE ENTRY
start
MOV r0, #9 MOV r1, #15
; your code here
stop
B stop END
ARM及Thumb指令集
Quiz #2 - GCD
03ARM指令集
(5)堆栈寻址
当 SP 指向最后压入堆栈的数据时,称为满堆栈 (Full Stack),而当 SP 指向下一个将要放入数据的 空位置时,称为空堆栈(Empty Stack);
入栈时,SP 向高地址方向变化,称为递增堆栈 (Ascending Stack);SP 向低地址方向变化,称为递 减堆栈(Descending Stack)。
1、ARM 指令集概述
ARM指令集是32位的,程序的启动都是从ARM 指令开始;所有的ARM指令集都可以是可以条件执 行的。
从以下三个方面介绍: ① 指令集编码 ② 条件执行 ③ 指令分类及指令格式
① 指令集编码
ARM指令集是以32位二进制编码的方式给出的, 大部分的指令编码中定义了第一操作数、第二操作数、 目的操作数、条件标志影响位以及每条指令所对应的 不同功能实现的二进制位。
乘法指令的二进制编码: 乘法指令的详细列表:
(2)Load/Store 指令
唯一用于寄存器和存储器之间进行数据传送的指令:
单寄存器的存取指令(LDR,STR) 多寄存器存取指令(LDM,STM) 单寄存器交换指令(SWP)
LDR/STR:单字和无符号字节的数据传送指令 前变址格式
LDR|STR {<cond>}{B} Rd,[Rn,<offset>]{!} 后变址格式
(1)立即寻址
操作数本身就在指令中给出,只要取出指令也就
取到了操作数,这个操作数被称为立即数,对应的寻
址方式也就叫做立即寻址。例如以下指令:
ADD R0,R0,#1
;R0←R0+1
ADD R0,R0,#0x3f ;R0←R0+0x3f
以上两指令中第二个源操作数即为立即数,要求 以“#”为前缀并声明其进制,如 0x、0d、0b等。
ARM及Thumb指令集
T Bit
Q 位:
仅ARM 5TE/J架构支持 指示饱和状态
仅ARM xT架构支持 T = 0: 处理器处于 ARM 状态 T = 1: 处理器处于 Thumb 状态
Mode位:
J位
处理器模式位
仅ARM 5TE/J架构支持 J = 1: 处理器处于Jazelle状态
34v11 ARM及Thumb指令集
ARM及Thumb指令集
T
H
E
A
R
C
H
I
T
E
C
T
U
R
E
F
O
R
T TM
H
E
D
I
G
I
T
A
L
W
O
R1 L
D
ARM指令小节目录
1.指令格式 2.条件码 3.存储器访问指令 4.数据处理指令 5.乘法指令 6.ARM分支指令 7.杂项指令 8.伪指令
34v11 ARM及Thumb指令集
TM
2
2
ARM指令长度概述
中断禁止位:
N = Negative result from ALU Z = Zero result from ALU C = ALU operation Carried out V = ALU operation oVerflowed
I = 1: 禁止 IRQ. F = 1: 禁止 FIQ.
TM
6
6
4.2 指令集介绍
ARM指令集——基本指令格式
ARM是三地址指令格式,指令的基本格式如下:
ARM指令集
IRQ(Interrupt Request)
IRQ异常属于正常的中断请求,可通过对处理器的nIRQ引脚 输入低电平产生,IRQ的优先级低于FIQ,当程序执行进入 FIQ异常时,IRQ可能被屏蔽。
若将CPSR的I位置为1,则会禁止IRQ中断,若将CPSR的I位 清零,处理器会在指令执行完之前检查IRQ的输入。注意只 有在特权模式下才能改变I位的状态。
不管是在ARM状态还是在Thumb状态下进入IRQ模式,IRQ 处理程序均会执行以下指令从IRQ模式返回:
SUBS PC , R14_irq , #4
该指令将寄存器R14_irq的值减去4后,复制到程序计数器PC 中,从而实现从异常处理程序中的返回,同时将SPSR_mode 寄存器的内容复制到当前程序状态寄存器CPSR中。
2、将CPSR复制到相应的SPSR中。 3、根据异常类型,强制设置CPSR的运行模式位。 4、强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相
应的异常处理程序处。
还可以设置中断禁止位,以禁止中断发生。
如果异常发生时,处理器处于Thumb状态,则当异常向量地 址加载入PC时,处理器自动切换到ARM状态。
半字需要2字节对齐(地址的最低位为0)。
5.1 引言--存储器组织
Little- and big-endian memory organizations
5.1 引言—特权模式
ARM operating modes and register usage.
SPSR----每一种特权模式(系统模式除外)都有一个与之相关的程序状态保存寄存器SPSR
0x00
0x00
0x00
0x12
8位常数
00000100100000000000000000000000
ARM指令集
ARM处理器的指令集ARM处理器的指令找了好久都没有找到完整版,在这里我把所有用过的ARM指令都整理下来,方便大家参考。
ADC(不更改状态寄存器): 带进位的加法(Addition with Carry)ADCS(更改状态寄存器)R1, R5, R9 ; R1=R5+R9,带进位ADD : 加法(Addition)ADD R0, R1, #256 ; R0 = R1 + 256AND : 逻辑与(logical AND)AND R0, R0, #3 ; R0 = 保持R0 的位0和1,丢弃其余的位。
BIC : 位清除(Bit Clear)BIC R0, R0, #%1011 ; 清除R0 中的位0、1、和3。
保持其余的不变。
EOR : 逻辑异或(logical Exclusive OR)EOR R0, R0, #3 ; 反转R0 中的位0 和1MOV : 传送(Move)MOV PC, R14 ; PC=R14MOVS PC, R14 ; 退出到调用者并恢复标志位(不遵从32-bit 体系)MVN : 传送取反的值(MoveNegative)MVN R0, #4 ; R0 = -5ORR : 逻辑或(logical OR)ORR R0, R0, #3 ; 设置R0 中位0 和1RSB : 反向减法(Reverse Subtraction)RSB R0, R1, R2 ; R0 = R2 - R1RSC : 带借位的反向减法(Reverse Subtraction with Carry)RSC{条件}{S} <dest>, <op 1>, <op 2>dest = op_2 - op_1 - !carrySBC : 带借位的减法(Subtraction with Carry)SBC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 - op_2 - !carrySUB : 减法(Subtraction)SUB R0, R1, #256 ; R0 = R1 - 256ARM 处理器组建了可以与数据处理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。
ARM总汇编指令集
ARM汇编指令集1 跳转指令1.1 跳转指令B:B LABLE ;跳转到标号LABEL处B 0X1111 ;跳转到绝对地址0X1111处1.2 带连接的跳转指令 BL:START …BL NEXT ;跳转到标号NEXT处,同时保存当前PC到R14中… ;返回地址…NEXT… ;子程序入口MOV PC,R14 ;返回1.3 带状态切换的跳转指令BX:MOV R0, #0X0201BX R0 ;程序跳转到0x0200处,微处理器切换到Thumb状态(地址必须是4的倍数,否则产生不可预知的后果)2算术运算指令2.1不带进位加法指令ADDADD R0, R1, R2 ;R0← (R1)+(R2)ADD R0, R1, #112 ;R0← (R1)+ 112ADD R0, R1, R2, LSL #1 ;R0←(R1)+(R2<<1) ;将R2中的值左移1位,再与R1值相加,结果送R02.2带进位加法指令 ADCADDS R0, R3, R6 ;加最低位字节,不带进位ADCS R1, R4, R7 ;加第二个字,带进位ADCS R2, R5,R8 ;加第三个字,带进位;三句话实现了96bit加法运算,由于ARM寄存器宽度只有32bit所以分三次相加2.3 不带进位减法指令SUB ;S—进位标志SUB R0, R1, R2 ;R0←(R1)- (R2)SUB R0, R1, #112 ;R0←(R1)- 112SUB R0, R1 ,R2 LSL#1 ;R0←(R1)- (R2<<1)2.4 带进位减法指令SBCSUBS R0, R3, R6 ;减最低位字节,不带进位SBCS R1, R4, R7 ;减第二个字,带进位SBCS R2, R5, R8 ;减第三个字,带进位;三句话实现了96bit减法运算,由于ARM寄存器宽度只有32bit所以分三次相减2.5 不带进位逆向减法指令RSBRSB R0, R1, R2 ;R0←(R2)- (R1)RSB R0, R1, #112 ;R0← 112- (R1)RSB R0, R1, R2, LSL#1 ;R0←(R2<<1)-R12.6 带进位逆向减法指令RSCRSBS R0, R6, R3 ;减最低字节的字,不带进位RSCS R1, R7, R4 ;减第二个字,带进位RSCS R2, R8, R5 ;减第三个字,带进位;三句话实现了96bit减法运算,由于ARM寄存器宽度只有32bit所以分三次相减2.732位乘法指令MULMUL R0, R1, R2 ;R0←(R1) X(R2)MULS R0, R1, R2 ;R0←(R1) X(R2) ;更新CPSR标志位2.8乘-累加指令 MLAMLA R0, R1, R2, R3 ;R0←(R1) X(R2)+(R3)MLAS R0, R1, R2, R3 ;R0←(R1) X(R2)+(R3) ;更新CPSR标志位2.9 无符号数长乘指令 UMULLMOV R5, #0X01MOV R8, #0X02UMULL R0, R1, R5, R8 ;(R1) (R0)←(R5)X(R8);UMULL指令实现64bit无符号数乘法2.10无符号长乘-累加指令 UMLALMOV R0, #0X01MOV R1, #0X02MOV R5, #0X01MOV R8, #0X02UMLAL R0, R1, R5, R8 ;R0←(R0) +(R5)X(R8)低字节;R1←(R1) +(R5) X(R8)高字节;UMLAL 指令为64位无符号乘-累加指令2.11有符号长乘指令SMULLMOV R5, #0X01MOV R8, #0X02SMULL R0, R1, R5, R8 ;(R1) (R0)←(R5)X(R8);SMULL指令实现64bit有符号数乘法2.12 有符号长乘-累加指令 SMLALMOV R0, #0X01MOV R1, #0X02MOV R5, #0X01MOV R8, #0X02SMLAL R0, R1, R5, R8 ;R0←(R0) +(R5)X(R8)低字节;R1←(R1) +(R5) X(R8)高字节; SMLAL 指令为64位有符号乘-累加指令2.13 比较指令 CMPCMP R1, #0X10 ;比较BGT TAG ;R1> #0X10转到TAG标号处……2.14负数比较指令 CMNCMN R0, #1 ;判断R0中的值是否为1的补码,是则置标志位Z为13逻辑运算指令3.1“与”指令 ANDMOV R0, 0XFFAND R0, R0, #3 ;取出R0的最低2bit3.2“或”指令 ORRMOV R0, 0XFFORR R0, R0, #33.3“异或”指令 EORMOV R0, 0XFFEOR R0, R0, #3 ;R0←(R0)^(0X03)3.4位清除指令 BICMOV R0, 0XFFBIC R0, R0, #B11 ;寄存器R0的低2bit被清零3.5测试比较指令 TSTTST R1, #b11 ;测试寄存器R1中的第0位和第1位,更新CPSR中标志位,应用中会在TST指令后加一条跳转指令。
ARM+指令集(中文版)
• 寄存器和处理器模式(26-bit 体系) • 寄存器和处理器模式(32-bit 体系) • 程序状态寄存器和操纵它的指令 • 寄存器装载和存储指令 • 算术和逻辑指令 • 移位操作 • 乘法指令 • 比较指令 • 分支指令 • 条件执行 • 软件中断指令 • APCS (ARM 过程调用标准)
• 编写安全的 32-bit 代码的基本规则 • IEEE 浮点指令 • 汇编器伪指令
2
PDF created with pdfFactory trial version
• 中断模式(IRQ 模式),用来处理发起中断的外设。这个模式也是有特权的。导致 IRQ 的设备有键盘、 VSync (在发生屏幕刷新的时候)、IOC 定时器、串行口、硬盘、软 盘、等等...
v1
R5 ------- R5 ------- R5 ------- R5
v2
R6 ------- R6 ------- R6 ------- R6
v3
R7 ------- R7 ------- R7 ------- R7
v4
R8 ------- R8 ------- R8
R8_fiq v5
R9 ------- R9 ------- R9
ARM指令快速查询
500附录A ARM指令集、ARM寻址方式和Thumb指令集速查表表A-1 ARM指令速查表表中符号说明表中符号说明{cond} 参见A-2 条件码字段<a_mode2> 参见A-2 寻址方式2<oprnd2> 参见A-2 第二操作码<a_mode2P> 参见A-2 寻址方式2(只有Post-indexed 方式)<fields> 参见A-2 PSR字段<a_mode3> 参见A-2 寻址方式3{S} 更新标志位<a_mode4L> 参见A-2 寻址方式4(Block load or Stack pop )C*,V* Flag is unpredicatable after these instructions in Architechure v4 and<a_mode4S> 参见A-2 寻址方式4(Block store or Stack push )earlier<a_mode5> 参见A-2 寻址方式5Q Sticky flag. Always updates on overflow( no S option) . Read and resetusing MRS and MSRx,y B:register[15:0],T:register[31:16] <reglist> A comma-separated list of registers , enclosed in braces({and})<immed_8r> A 32-bit constant , formed by right-rotating an 8-bit value by an even{!} Updates base register after data transfer if ! presentnumber of bits<immed_8*4> A 10-bit constant , formed by shift-rotating an 8-bit value by two bits §参见A-2 ARM架构版本号功能§汇编指令S 更新Q 操作注释Move MOV {cond } {S} Rd , <Oprnd2> N Z C Rd:=Oprnd2 传送NOT MVN {cond } {S} Rd , <Oprnd2> N Z C Rd:=0xFFFFFFFF EOR Oprnd2SPSR至寄存器 3 MRS {cond } Rd , SPSR Rd:=SPSR500CPSR至寄存器 3 MRS {cond } Rd , CPSR Rd:=CPSR寄存器至SPSR 3 MSR {cond } SPSR_<fields>, Rm SPSR:=Rm(selected bytes only)寄存器至CPSR 3 MSR {cond } CPSR_<fields>, Rm CPSR:=Rm(selected bytes only)立即数至SPSR 3 MSR {cond } SPSR_<fields>, #<immed_8r> SPSR:=immed_8r(selected bytes only)立即数至CPSR 3 MSR {cond } CPSR_<fields>, #<immed_8r> CPSR:= immed_8r(selected bytes only)加法ADD {cond } {S} Rd , Rn , <Oprand2> N Z C V Rd:=Rn + Oprnd2带进位ADC {cond } {S} Rd , Rn , <Oprand2> N Z C V Rd:=Rn + Oprnd2 + Carry饱和加5E QADD {cond } Rd , Rm , Rn Q Rd:=SA T( Rm + Rn ) No shift/rotate 饱和乘2加5E QDADD {cond } Rd , Rm , Rn Q Rd:=SA T( Rm + SA T(Rn*2) ) No shift/rotate 减法SUB {cond } {S} Rd , Rn , <Oprand2> N Z C V Rd:=Rn —Oprnd2 带进位SBC {cond } {S} Rd , Rn , <Oprand2> N Z C V Rd:=Rn —Oprnd2 —NOT(Carry)反减RSB {cond } {S} Rd , Rn , <Oprand2> N Z C V Rd:= Oprnd2 —Rn带进位反减RSS {cond } {S} Rd , Rn , <Oprand2> N Z C V Rd:= Oprnd2 —Rn —NOT(Carry)饱和减5E QSUB {cond } Rd , Rm , Rn Q Rd:=SA T( Rm —Rn ) No shift/rotate 饱和乘2减5E QDSUB {cond } Rd , Rm , Rn Q Rd:=SA T( Rm —SA T(Rn*2) ) No shift/rotate 乘法 2 MUL {cond } {S} Rd , Rm , Rs N Z C* Rd:=(Rm*Rs)[31:0] 乘加 2 MLA {cond } {S} Rd , Rm , Rs , Rn N Z C* Rd:=((Rm*Rs)+Rn)[31:0]无符号长整数乘法M UMULL {cond } {S} RdLo , RdHi , Rm , Rs N Z C* V* RdHi , RdLo:=unsigned(Rm*Rs)无符号长整数乘加M UMLA L{cond } {S} RdLo , RdHi , Rm , Rs N Z C* V* RdHi , RdLo:=unsigned(RdHi ,RdLo+Rm*Rs)有符号长整数乘法M SMULL {cond } {S} RdLo , RdHi , Rm , Rs N Z C* V* RdHi , RdLo:= signed(Rm*Rs)有符号长整数乘加M SMLA L{cond } {S} RdLo , RdHi , Rm , Rs N Z C* V* RdHi , RdLo:= signed(RdHi , RdLo+Rm*Rs)有符号16*16乘法5E SMULxy {cond } Rd , Rm , Rs Rd:= Rm[x]*Rs[y] No shift/rotate 算术有符号32*16乘法5E SMULWy {cond } Rd , Rm , Rs Rd:= (Rm[x]*Rs[y])[47:16] No shift/rotate501有符号16*16乘加5E SMLAxy {cond } Rd , Rm , Rs , Rn Q Rd:= Rn + Rm[x]*Rs[y] No shift/rotate 有符号32*16乘加5E SMLAWy {cond } Rd , Rm , Rs , Rn Q Rd:= Rn + (Rm[x]*Rs[y] )[47:16] No shift/rotate有符号16*16长整数乘加5ESMLALxy {cond } RdLo , RdHi , Rm , Rs RdHi , RdLo:= RdHi , RdLo+Rm[x]*Rs[y] No shift/rotate前导零计数 5 CLZ{cond } Rn , Rm Rd:=number of leading zeroes in Rm 测试TST{cond} Rn , <Oprand2> N Z C Update CPSR flags on Rn AND Oprnd2 测试相等TEQ{cond} Rn , <Oprand2> N Z C Update CPSR flags on Rn EOR Oprnd2 逻辑与AND{cond} {S} Rd , Rn , <Oprand2> N Z C Rd:=Rn AND Oprnd2逻辑异或EOR{cond} {S} Rd , Rn , <Oprand2> N Z C Rd:=Rn AND Oprnd2逻辑或ORR{cond} {S} Rd , Rn , <Oprand2> N Z C Rd:=Rn AND Oprnd2位清除BIC{cond} {S} Rd , Rn , <Oprand2> N Z C Rd:=Rn AND Oprnd2逻辑空操作NOP R0:=R0比较CMP{cond} Rn , Oprnd2 N Z C V Update CPSR flags on Rn —Oprnd2 比较比较反值CMN{cond} Rn , Oprnd2 N Z C V Update CPSR flags on Rn + Oprnd2转移B{cond} label R15:=label Label must be within±32 Mb of currentinstruction带链接BL{cond} label R14:=R15-4 , R15:=label Label must be within±32 Mb of currentinstruction带交换4T BX{cond} Rm R15:=Rm , change to Thumb if Rm[0] is 1 转移带链接和交换(1)5T BLX label R14:=R15-4 , R15:=label , change to Thumb Cannot be conditionalLabel must be within±32 Mb of currentinstruction502带链接和交换(2)5T BLX{cond} Rm R14:=R15-4 , R15:=Rm[31:1] , change to Thumb if Rm[0] is 1字读取LDR{cond} Rd , <a_mode2> Rd:=[address] 用户模式LDR{cond} T Rd , <a_mode2P>转移(交换)LDR{cond} R15 , <a_mode2> Rd:=[address][31:1](§5T:Change to Thumb if [address][0] is 1) 字节读取LDR{cond} B Rd , <a_mode2> Rd:=ZeroExtend[byte from address] 用户模式LDR{cond} BT Rd , <a_mode2P>有符号数 4 LDR{cond} SB Rd, <a_mode3> Rd:=SignExtend[byte from address] 半字 4 LDR{cond} H Rd , <a_mode3> Rd:=ZeroExtend[halfword from address] 有符号数 4 LDR{cond} SH Rd , <a_mode3> Rd:=SignExtend[halfword from address] Pop或块数据读取LDM{cond} <a_mode4L> Rd{!} ,<reglist-PC> Load list of registers from [Rd] 返回(交换)LDM{cond} <a_mode4L> Rd{!} ,<reglist+PC> Load registers, R15:=[address][31:1](§5T:Change to Thumb if [address][0] is 1)保存CPSR LDM{cond} <a_mode4L> Rd{!} ,<reglist+PC>^ Load registers, branch(§5T:and exchange) ,CPSR:=SPSR Use from exception mode onlyLoad寄存器(用户模式下)LDM{cond} <a_mode4L> Rd{!} ,<reglist-PC>^ Load list of User mode register to [Rd] Use from privilegedmode only 字存储STR{cond} Rd , <a_mode2> [address]:=Rd用户模式STR{cond} T Rd , <a_mode2P> [address]:=Rd字节存储STR{cond} B Rd, <a_mode2> [address][7:0]:=Rd[7:0]用户模式STR{cond} BT Rd , <a_mode2P> [address][7:0]:=Rd[7:0]半字存储 4 STR{cond} H Rd , <a_mode3> [address][15:0]:=Rd[15:0]StorePush, 或块数据存储STM{cond} <a_mode4S> Rd{!} ,<reglist> Store list of registers to [Rd]503寄存器(用户模式下)STM{cond} <a_mode4L> Rd{!} ,<reglist>^ Store list of User mode registers to [Rd] Use from privilegedmode only字交换 3 SWP{cond} Rd , Rm , [Rn] Temp:=[Rn] , [Rn]:=Rm , Rd:=temp交换字节交换3 SWP{cond} B Rd , Rm , [Rn] Temp:=ZeroExtend([Rn][7:0]) ,[Rn][7:0]:=Rm , Rd:=temp数据运算 2 CDP{cond} P <cpnum>,<op1>CRd , CRn , CRm , <op2>5 CDP2 P <cpnum>,<op1>CRd , CRn , CRm , <op2> Cannot be conditional ARM寄存器至协处理器 2 MRC{cond} P <cpnum>,<op1>CRd , CRn , CRm , <op2>5 MRC2 P <cpnum>,<op1>CRd , CRn , CRm , <op2> Cannot be conditional协处理器至ARM寄存器2MCR{cond} P <cpnum>,<op1>CRd , CRn , CRm , <op2>5 MCR2 P <cpnum>,<op1>CRd , CRn , CRm , <op2> Cannot be conditional存储器至协处理器 2 LDC{cond} P <cpnum>, CRd , <a_mode5>5 LDC2 P <cpnum>,CRd , <a_mode5> Cannot be conditional协处理器至存储器 2 STC{cond} P <cpnum>, CRd , <a_mode5>协处理器5 STC2 P <cpnum>,CRd , <a_mode5> Cannot be conditional软件中断SWI{cond}<immed_24> Software interrupt exception 24-bit value encodedin instruction断点 5 BKPT <immed_16> Prefetch abort or enter debug state Cannot be conditional504表A –2 ARM寻址方式速查表寻址方式2--- Word and Unsigned Byte Data TransferPre-indexed Immediate offset [Rn,#±<immed_12>]{!}Zero Offset [Rn] Equivalent to[Rn,#0]Register Offset [Rn, ±Rm]{!}Scaled register offset [Rn, ±Rm,LSL #<immde_5>]{!} Allowed shifts 0-31[Rn,±Rm,LSR#<immde_5>]{!} Allowed shifts 1-32[Rn,±Rm,ASR#<immde_5>]{!} Allowed shifts 1-32[Rn,±Rm,ROR#<immde_5>]{!} Allowed shifts 1-31[Rn, ±Rm,RRX]{!}Post-indexed Immediate offset [Rn],# ±<immed_12>Register Offset [Rn], ±RmScaled register offset [Rn], ±Rm,LSL#<immed_5> Allowed shifts 0-31[Rn], ±Rm,LSR#<immed_5> Allowed shifts 1-32[Rn], ±Rm,ASR#<immed_5> Allowed shifts 1-32[Rn], ±Rm,ROR#<immed_5> Allowed shifts 1-31[Rn], ±Rm,RRX寻址方式2(Post-indexed only)Post-indexed Immediate offset [Rn],#±<immed_12>Zero Offset [Rn] Equivalent to[Rn],#0Register Offset [Rn], ±RmScaled register offset [Rn], ±Rm,LSL #<immde_5> Allowed shifts 0-31[Rn], ±Rm,LSR #<immde_5> Allowed shifts 1-32[Rn], ±Rm,ASR #<immde_5> Allowed shifts 1-32[Rn], ±Rm,ROR #<immde_5> Allowed shifts 1-31[Rn], ±Rm,RRX寻址方式5 ------- Coprocessor Data TransferPre-indexed mmediate offset [Rn,#±<immed_8*4>]{!}Zero Offset [Rn] Equivalent to[Rn,#0] Post-indexed Immediate offset [Rn],# ±<immed_8*4>Unindexed No offset [Rn], {8 – bit copro.option}ARM 架构版本n ARM 架构n版本nT ARM 架构n版本T分支M ARM 架构3M和4版本M分支nE ARM 架构n版本E分支寻址方式4 ---- Multiple Data TransferBlock load Stack popIA Increment AfterIB Increment BeforeDA Decrement AfterDB Decrement BeforeFD Full DescendingED Empty DescendingFA Full AscendingEA Empty AscendingBlock store Stack pushIA Increment AfterIB Increment BeforeDA Decrement AfterDB Decrement BeforeEA Empty AscendingFA Full AscendingED Empty DescendingFD Full Descending505506PSR 字段后缀 含义 c 控制段屏蔽码 PSR[7:0] f 标志段屏蔽码 PSR[31:24] s 状态段屏蔽码 PSR[23:16] x扩展段屏蔽码PSR[15:8]条件代码含义标志位状态显示寻址方式3 -----Halfword and Signed Byte Data Transfer Pre-indexed Immediate offset [Rn],#±<immed_8>{!} Zero Offset [Rn] Equivalent to[Rn,#0] Register [Rn, ±Rm]{!} Post-indexed Immediate offset [Rn],# ±<immed_8> Register[Rn], ±Rm第二操作数immediate#<immed_8r>Logical shift left immediate Rm , LSL # <immed_5> Allowed shift 0~31 Logical shift right immediate Rm , LSR # <immed_5> Allowed shift 0~31 Arithmetic shift right immediate Rm , ASR # <immed_5> Allowed shift 0~31 Rotate right immediate Rm , ROR # <immed_5> Allowed shift 0~31 RegisterRm Rotate right extended Rm , RRX Logical shift left Register Rm , LSL Rs Logical shift right Register Rm , LSR Rs Arithmetic shift right Register Rm , ASR Rs Rotate right extendedRm , ROR RsEQ 相等/是否为0 Z置位NE 不等Z清零CS/ HS*进位置位/大于C置位CC/L O*进位清零/小于C清零MI 结果为负N置位PL 结果为正N清零VS 溢出V置位VC 无溢出V清零HI*大于C置位并且Z清零LS*小于C清零或Z置位GE*大于等于N等于VLT*小于等于N不等于VGT*大于Z清零或N等于VLE*小于等于Z置位或N不等于VAL 始终任何表中符号说明{!} Update base register after data transfer if ! present.(Post-indexed always updates)<immed_8r> A 32-bit constant , formed by right-rotating an 8-bit value by an even number of bits±+or-. (+may be omitted)507表A-3 Thumb指令速查表All Thumb registers are Lo (R0~R7) except where specified. Hi refisters are R8~R15功能§汇编指令码标志位是否更新Action Notesimmediate MOV Rd , #<immed_8> √Rd:=immed_8 8-bit immediate valueLo to Lo MOV Rd , Rm √Rd:=RmMovHi to Lo ,Lo to Hi, Hi to Hi MOV Rd , Rm ×Rd:=Rm Not Lo to LoAdd ADD Rd , Rn , #<immed_3> √Rd:=Rn+immed_3 3-bit immediate value Lo to Lo ADD Rd , Rn , Rm √Rd:=Rn+RmHi to Lo ,Lo to Hi, Hi to Hi ADD Rd , Rm ×Rd:=Rd+Rm Not Lo to Loimmediate ADD Rd , #<immed_8> √Rd:=Rn+immed_8 8-bit immediate valueWith carry ADC Rd , Rm √Rd:=Rn+Rm+C-bitValue to SP ADD SP, #<immed_7*4> ×SP:=SP+immed_7*4 9-bit immediate value(word-aligned )Form address from SP ADD Rd , SP , #<immed_8*4> ×Rd:=SP+immed_8*4 10-bit immediate value(word-aligned ) Form address from PC ADD Rd , PC , #<immed_7*4> ×Rd:=(PC AND 0xFFFFFFFC) +immed_8*4 10-bit immediate value(word-aligned ) subtract SUB Rd , Rn , Rm √Rd:=Rn-RmImmediate 3 SUB Rd , Rn , #<immed_3> √Rd:=Rn-immed_3 3-bit immediate valueImmediate 8 SUB Rd , #<immed_8> √Rd:=Rn-immed_8 8-bit immediate valueWith carry SBC Rd , Rm √Rd:=Rn-Rm-NOT C-bitValue to SP SUB SP , #<immed_7*4> ×SP:=SP-immed_7*4 9-bit immediate value(word-aligned ) ArithmeticNegate NEG Rd , Rm √Rd:= -Rm508Multiply MUL Rd , Rm √Rd:= Rm*RdCompare CMP Rd , Rm √Update CPSR Flags on Rn-Rm Can Lo to Lo, Lo to Hi , Hi to Lo , or Hi to Hi Negative CMN Rd , Rm √Update CPSR Flags on Rn+Rmimmediate CMP Rd , #<immed_8> √Update CPSR Flags on Rn-immed_8 8-bit immediate value No operation NOP ×R8:=R8 Flags not affectedLogicAND AND Rd , Rm √Rd:=Rd AND RmExclusive OR EOR Rd , Rm √Rd:=Rd EOR RmOR ORR Rd , Rm √Rd:=Rd OR RmBit Clear BIC Rd , Rm √Rd:=Rd AND NOT RmMoVe Not MVN Rd , Rm √Rd:=NOT RmTest bits TST Rn , Rm √Update CPSR Flags on Rn AND RmLogical shift left immediate LSL Rd , Rm , #<immed_5> √Rd:=Rm<<immed_5 5-bit immediate shift. Allowed shifts 0~31 Shift/RotateLSL Rd , Rs √Rd:=Rd<<RsLogical shift right immediate LSR Rd , Rm , #<immed_5> √Rd:=Rm>>immed_5 5-bit immediate shift. Allowed shifts 1~32LSR Rd , Rs √Rd:=Rd>>RsArithmetic shift right immediate ASR Rd , Rm , #<immed_5> √Rd:=Rm ASR immed_5 5-bit immediate shift. Allowed shifts 1~32ASR Rd , Rs √Rd:=Rd ASR RsRotate right immediate ROR Rd , Rs √Rd:=Rd ROR RsConditional branch B{cond} label R15:=label Label must be within –252 to +258 bytes of Branchcurrent instuction Unconditional branch B label R15:=label Label must be within ±2Kb of currentinstuctionlong branch with link BL label R14:=R15-2 , R15:=label Encoded as two Thumb instructionsLabel must be within ±4Mb of currentinstuction509Branch and exchange BX Rm R15:=Rm AND 0xFFFFFFFE Change to Arm state if Rm[0]=0Branch with link and exchange BLX label R14:=R15-2 , R15:=label , change to ARM Encoded as two Thumb instructionsLabel must be within ±4Mb of currentinstuctionBranch with link and exchange BLX Rm R14:=R15-2 , R15:=Rm AND 0xFFFFFFFFE ,change to ARM if Rm[0] is 0SWI<immed_8> Software interrupt processor exception 8-bit immediate value encoded in instruction SoftwareinterruptBreakpoint 5T BKPT< immed_8> Prefetch abort or enter debug stateWith immediate offset , word LDR Rd , [Rn , #< immed_5*4>] Rd:=[Rn+immed_5*4]LoadHalfword LDRH Rd , [Rn , #< immed_5*2>] Rd:=ZeroExtend([Rn+immed_5*2][15:0]) Clears bits 31:16byte LDRB Rd , [Rn , #< immed_5>] Rd:=ZeroExtend([Rn+immed_5][7:0]) Clears bits 31:8 With register offset , word LDR Rd , [Rn , Rm] Rd:=[Rn+Rm]halfword LDRH Rd , [Rn , Rm] Rd:=ZeroExtend([Rn+Rm][15:0]) Clears bits 31:16signed LDRSH Rd , [Rn , Rm] Rd:=SignExtend([Rn+Rm][15:0]) Sets bits 31:16 to bit 15byte LDRB Rd , [Rn , Rm] Rd:=ZeroExtend([Rn+Rm][7:0]) Clear bits 31:8Signed byte LDRSB Rd , [Rn , Rm] Rd:=SignExtend([Rn+Rm][7:0]) Sets bits 31:8 to bit 7PC-relative LDR Rd , [PC , #< immed_8*4>] Rd:=[(PC AND 0xFFFFFFFC)+immed_8*4]SP-relative LDR Rd , [SP , #< immed_8*4>] Rd:=[SP+immed_8*4]Multiple LDMIA Rn!, < register> Loads list of registers Always updates base registerStoreWith immediate offset , word STR Rd , [Rn , #< immed_5*4>] [Rn+immed_5*4] := Rdhalfword STRH Rd , [Rn , #< immed_5*2>] [Rn+immed_5*2][15:0] := Rd[15:0] Ignores Rd[31:16]byte STRB Rd , [Rn , #< immed_5>] [Rn+immed_5][7:0] := Rd[7:0] Ignores Rd[31:8] With register offset , word STR Rd , [Rn , Rm] [Rn+Rm] := Rdhalfword STRH Rd , [Rn , Rm] [Rn+Rm][15:0] := Rd[15:0] Ignores Rd[31:16]510byte STRB Rd , [Rn , Rm] [Rn+Rm][7:0] := Rd[7:0] Ignores Rd[31:8]SP-relative STR Rd , [SP , #< immed_8*4>] [SP+immed_8*4] := RdMultiple STMIA Rn!, < register> Stores list of registers Always updates base register Push PUSH < register> Push registers onto stack Full descending stackPush/PopPush with link PUSH < register , LR> Push LR and registers onto stackPop POP < register> POP registers from stackPop and return POP < register , PC> POP registers , branch to address loaded to PCPop and return with exchange 5T POP < register , PC> Push registers , branch , and change to ARM stateif address[0] =0511。
- 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指令、程序状态寄存器指令、协处理器指令和软件中断指令六大类构成。