ARM及Thumb指令集.ppt
《ARM及Thumb指令集.ppt》由会员分享,可在线阅读,更多相关《ARM及Thumb指令集.ppt(103页珍藏版)》请在三一办公上搜索。
1、ARM及Thumb指令集,ARM指令小节目录,1.指令格式2.条件码3.存储器访问指令4.数据处理指令5.乘法指令6.ARM分支指令7.杂项指令8.伪指令,ARM指令长度概述,ARM指令长度指令集可以是以下任一种32 bits 长(ARM状态)16 bits 长(Thumb 状态)ARM7TDMI 支持3种数据类型字节(8-bit)半字(16-bit)字(32-bit)字必须被排成4个字节边界对齐,半字必须被排列成2个字节边界对齐,ARM指令长度概述,向后兼容:新版本增加指令,并保持指令向后兼容;Load-store 结构*load/store 从存储器中读某个值,操作完后再将其放回存储器中只
2、对存放在寄存器的数据进行处理对于存储器中的数据,只能使用load/store指令进行存取,简单的ARM程序,;文件名:TEST1.S;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试 AREAExample1,CODE,READONLY;声明代码段Example1 ENTRY;标识程序入口 CODE32;声明32位ARM指令START MOVR0,#0;设置参数 MOVR1,#10LOOPBLADD_SUB;调用子程序ADD_SUB BLOOP;跳转到LOOPADD_SUB ADDSR0,R0,R1;R0=R0+R1 MOVPC,LR;子程序返回 END;文件结束,使用“;”进
3、行注释,标号顶格写,实际代码段,声明文件结束,4.2 指令集介绍,ARM指令集指令格式,ARM是三地址指令格式,指令的基本格式如下:,4.2 指令集介绍,ARM指令集基本指令格式,S,其中号内的项是必须的,号内的项是可选的。各项的说明如下:,opcode:指令助记符;cond:执行条件;S:是否影响CPSR寄存器的值;Rd:目标寄存器;Rn:第1个操作数的寄存器;operand2:第2个操作数;,例:,ARM指令的基本格式如下:,4.2 指令集介绍,ARM指令集第2个操作数,S,灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式:#immed_8r常数表达式;Rm寄存器
4、方式;Rm,shift寄存器移位方式;,4.2 指令集介绍,ARM指令集第2个操作数,#immed_8r常数表达式 该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到。,循环右移10位,8位常数,4.2 指令集介绍,ARM指令集第2个操作数,Rm寄存器方式 在寄存器方式下,操作数即为寄存器的数值。例如:SUBR1,R1,R2,4.2 指令集介绍,ARM指令集第2个操作数,Rm,shift寄存器移位方式 将寄存器的移位结果作为操作数(移位操作不消耗额外的时间),但Rm值保持不变,移位方法如下:,桶形移位器,4.2 指令集介绍,桶形移位器操作,4.2 指令集介绍,4.2 指令集介绍,A
5、RM指令集第2个操作数,4.2 指令集介绍,ARM指令集第2个操作数,Rm,shift寄存器移位方式例如:ADDR1,R1,R1,LSL#3;R1=R1+R1R3,ARM指令目录,1.指令格式2.条件码3.存储器访问指令4.数据处理指令5.乘法指令6.ARM分支指令7.杂项指令8.伪指令,ARM指令的基本格式如下:,4.2 指令集介绍,ARM指令集条件码,S,使用条件码“cond”可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率。所有的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行 功能。如果指令不标明条件代码,将默认为无条件(AL)执行。,指令条件码表,4
6、.2 指令集介绍,ARM指令集条件码,C代码:If(a b)a+;Elseb+;,对应的汇编代码:CMPR0,R1;R0(a)与R1(b)比较ADDHIR0,R0,#1;若R0R1,则R0=R0+1ADDLSR1,R1,#1;若R01,则R1=R1+1,示例:,ARM指令可以通过添加适当的条件码前缀来达到条件执行的目的。这样可以提高代码密度,减少分支跳转指令数目,提高性能。CMP r3,#0 CMP r3,#0 BEQ skip ADDNE r0,r1,r2 ADD r0,r1,r2skip默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。CMP不需要增加“S”
7、就可改变相应的标志位。loop SUBS r1,r1,#1 BNE loop,条件执行及标志位,条件码,下表为所有可能的条件码:注意:AL为默认状态,不需要单独指出,程序状态寄存器,条件位:N=Negative result from ALU Z=Zero result from ALUC=ALU operation Carried outV=ALU operation oVerflowedQ 位:仅ARM 5TE/J架构支持指示饱和状态J 位仅ARM 5TE/J架构支持J=1:处理器处于Jazelle状态,中断禁止位:I=1:禁止 IRQ.F=1:禁止 FIQ.T Bit仅ARM xT架构支
8、持T=0:处理器处于 ARM 状态T=1:处理器处于 Thumb 状态Mode位:处理器模式位,条件执行示例,一系列的指令都使用条件指令if(a=0)func(1);CMP r0,#0MOVEQ r0,#1BLEQ func置标志位,再使用不同的条件码if(a=0)x=0;if(a0)x=1;CMP r0,#0MOVEQ r1,#0MOVGT r1,#1使用条件比较指令if(a=4|a=10)x=0;CMP r0,#4CMPNE r0,#10MOVEQ r1,#0,4.2 指令集介绍,ARM指令集存储器访问指令,ARM处理器是典型的RISC处理器,对存储器的访问只能使用加载和存储指令实现。AR
9、M7处理器是冯诺依曼存储结构,RAM存储空间及I/O映射空间统一编址,除对RAM操作以外,对外围IO、程序数据的访问均要通过加载/存储指令进行。存储器访问指令分为单寄存器操作指令和多寄存器操作指令。,ARM存储器访问指令单寄存器加载,ARM存储器访问指令单寄存器存储,LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。若使用LDR指令加载数据到PC寄存器,则实现程序跳转功能,这样也就实现了程序散转。所有单寄存器加载/存储指令可分为“字和无符号字节加载存储指令”和“半字和有符号字节加载存储指令。,LDR和STR字和无符号字节加载/存储指令 LDR指令用于从内
10、存中读取单一字或字节数据存入寄存器中,STR指令用于将寄存器中的单一字或字节数据保存到内存。指令格式如下:,ARM存储器访问指令单寄存器存储,LDRcondTRd,;将指定地址上的字数据读入Rd STRcondTRd,;将Rd中的字数据存入指定地址 LDRcondBTRd,;将指定地址上的字节数据读入Rd STRcondBTRd,;将Rd中的字节数据存入指定地址,其中,T为可选后缀。若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看成是在用户模式下进行的。T在用户模式下无效,不能与前索引偏移一起使用T。,ARM存储器访问指令单寄存器存储,LDR和STR字和无符号字节加载/存储指令编码
11、,指令执行的条件码,I为0时,偏移量为12位立即数,为1时,偏移量为寄存器移位,P表示前/后变址,U表示加/减,B为1表示字节访问,为0表示字访问,W表示回写,为指令的寻址方式,Rd为源/目标寄存器,Rn为基址寄存器,L用于区别加载(L为1)或存储(L为0),ARM存储器访问指令单寄存器存储,LDR和STR字和无符号字节加载/存储指令 LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地址偏移量有以下3种格式:立即数。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR
12、 R1,R0,#0 x12;R1-R0+0 x12寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,R0,R2;R1-R0+R2 LDR R1,R0,-R2;R1-R0-R2寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,R0,R2,LSL#2;R1-R0+R2*4,ARM存储器访问指令单寄存器存储,LDR和STR字和无符号字节加载/存储指令 LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地址偏移量有以下3种格式:
13、立即数。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,R0,#0 x12;R1-R0+0 x12寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,R0,R2;R1-R0+R2 LDR R1,R0,-R2;R1-R0-R2寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,R0,R2,LSL#2;R1-R0+R2*4,ARM存储器访问指令单寄存器存储,从寻址方式的地址计算方法分,加载/存储指令有以下4种格式:零偏移。如:LDR Rd,R
14、n 前索引偏移。如:LDR Rd,Rn,#0 x04!程序相对偏移。如:LDR Rd,labe1 后索引偏移。如:LDR Rd,Rn,#-0 x04注意:必须保证字数据操作的地址是32位对齐的。,LDR和STR字和无符号字节加载/存储指令,LDR和STR半字和有符号字节加载/存储指令 这类LDR/STR指令可加载有符号半字或字节,可加载/存储无符号半字。偏移量格式、寻址方式与加载/存储字和无符号字节指令相同。,ARM存储器访问指令单寄存器存储,LDRcondSB Rd,;将指定地址上的有符号字节读入Rd LDRcondSH Rd,;将指定地址上的有符号半字读入Rd LDRcondH Rd,;将
15、指定地址上的半字数据读入Rd STRcondH Rd,;将Rd中的半字数据存入指定地址,注意:1.有符号位半字/字节加载是指用符号位加载扩展到32位,无符号半字加载是指用零扩展到32位;2.半字读写的指定地址必须为偶数,否则将产生不可靠的结果;,ARM存储器访问指令单寄存器存储,LDR和STR半字和有符号字节加载/存储指令编码,指令执行的条件码,I为0时,偏移量为12位立即数,为1时,偏移量为寄存器移位,P表示前/后变址,U表示加/减,W表示回写,为指令的寻址方式,Rd为源/目标寄存器,Rn为基址寄存器,L用于区别加载(L为1)或存储(L为0),S为1表示有符号访问,为0表示无符号访问,H为1
16、表示半字访问,为0表示字节访问,LDR和STR指令应用示例:1.加载/存储字和无符号字节指令LDRR2,R5;将R5指向地址的字数据存入R2STRR1,R0,#0 x04;将R1的数据存储到R0+0 x04地址LDRBR3,R2,#-1;将R2指向地址的字节数据存入R3,R2R21STRBR0,R3,-R8 ASR 2;R0-R3-R8/4,存储R0的最低有效字节2.加载/存储半字和有符号字节指令LDRSB R1,R0,R3;将R0+R3地址上的字节数据存入R1,;高24位用符号扩展LDRH R6,R2,#2;将R2指向地址的半字数据存入R6,高16位用0扩展;读出后,R2=R2+2STRH
17、R1,R0,#2!;将R1的半字数据保存到R0+2地址,;只修改低2字节数据,然后R0=R0+2,ARM存储器访问指令单寄存器存储,练习,STR R1,R2,R5!LDR R5,R3,#-0X03STREQ R4 R0,R4,LSL R5STREQ R4 R6,#-0X08LDR R0,R2!,-R6 LDRNE R4,R5,R3,R6LDR R4,STARTLDR R1,R0!LDR SP,#-0X04STR R1,START;(必须保证START处可以存贮数据)LDR PC,R5LDR PC,R5,半字和字节命令,STRB R5,SP,R3LDRB R0,R2,-R5,LSL,#0X02L
18、DRB PC,R5STRB R0,R15,#-0X02!LDRHNE R3,R5,R8LDRH R6,R15,#-0X20!STRH R0,R4,R2,LSL0X02STRH R0,PC,#0X08,有符号半字和有符号字节命令,LDRSH R5,R3-R6LDRSB R0,R4,#0X0FFLSRSH R15,R0-R6LSRSB R5,R4,0X101LDRNESH R6,SP,#0X06!STRSH R6,R6,T后缀指令,LDRT R5,R6,R7LDRBT R3,R7,R0STRBT R0,R2,LSL#0X01STRT R7,R3,#0X02!LDRT R5,R7,R3,LSL#0X
19、040SDRT R5,R6,LSL#0X03LDRT R6,START,目标寄存器器和基址寄存器是同一寄存器,LDR R4,R4,R3,LSL#2LDR R4,R4,R3,LSL#2!LDR R4,R4,R3,LSL#2LDR R4,R3,R4,LSL#2!STR R4,R4,R3,LSL#2!STR R4,R4,R3,LSL#2,使用R15时的数据传送,LDR R15,R5LDR R6,R15LDR R7,R15,R7!STR R15,R7,R1STR R0,R15 STR R0,R15,R8STR R0,R15,#0X4!,ARM存储器访问指令多寄存器存取,多寄存器加载/存储指令可以实现在
20、一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。,ARM存储器访问指令多寄存器存取,多寄存器加载/存储指令格式如下:LDMcond Rn!,reglist STMcond Rn!,reglistcond:指令执行的条件;模式:控制地址的增长方式,一共有8种模式;!:表示在操作结束后,将最后的地址写回Rn中;reglist:表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开,如R1,R2,R6-R9,寄存器由小到大排列;:可选后缀。允许在用户模式或系统模
21、式下使用。它有以下两个功能:1)若op是LDM且寄存器列表包含R15时,那么除了正常的多寄存器传送外,还将SPSR也复制到CPSR中。这用于异常处理返回,仅在异常模式下使用。2)数据传入或传出的是用户模式下的寄存器,而不是当前模式的寄存器。,ARM存储器访问指令多寄存器存取,LDM和STM多寄存器加载/存储指令编码,指令执行的条件码,S对应于指令中的”符号,P表示前/后变址,U表示加/减,W表示回写,寄存器列表,Rn为基址寄存器,L用于区别加载(L为1)或存储(L为0),ARM存储器访问指令多寄存器存取,多寄存器加载/存储指令的8种模式如下表所示,右边四种为堆栈操作、左边四种为数据传送操作。,
22、进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB进行读取和存储。进行堆栈操作操作时,要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA实现堆栈操作。,ARM存储器访问指令多寄存器存取,数据块传送指令操作过程如右图所示,其中R1为指令执行前的基址寄存器,R1则为指令执行后的基址寄存器。,ARM存储器访问指令多寄存器存取,;使用数据块传送指令进行堆栈操作STMDAR0!,R5-R6.LDMIBR0
23、!,R5-R6,;使用堆栈指令进行堆栈操作STMEDR13!,R5-R6.LDMEDR13!,R5-R6,两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。,堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈,4.1 ARM处理器寻址方式,寻址方式分类堆栈寻址
24、,4.1 ARM处理器寻址方式,寻址方式分类堆栈寻址,0 x12345678,0 x12345678,堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。,4.1 ARM处理器寻址方式,寻址方式分类堆栈寻址,0 x12345678,所以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈
25、向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。,4.1 ARM处理器寻址方式,寻址方式分类堆栈寻址LDMIA R4,R0,R1,R2,R3,R5,数据块传送指令,STMFD R13!,R0,R4-R6,R13LDMID R4,R0,R1,R2,R3,R4,R6LDMFD SP!,R12,R15LDMFD SP!,R12,R15STMID R0,R0-R5STMIA R1,R0-R5,ARM存储器访问指令寄存器和存储器交换指令,SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。使用S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM Thumb 指令
链接地址:https://www.31ppt.com/p-2259612.html