ARM及Thumb指令集.ppt

上传人:laozhun 文档编号:2259612 上传时间:2023-02-07 格式:PPT 页数:103 大小:1,024KB
返回 下载 相关 举报
ARM及Thumb指令集.ppt_第1页
第1页 / 共103页
ARM及Thumb指令集.ppt_第2页
第2页 / 共103页
ARM及Thumb指令集.ppt_第3页
第3页 / 共103页
ARM及Thumb指令集.ppt_第4页
第4页 / 共103页
ARM及Thumb指令集.ppt_第5页
第5页 / 共103页
点击查看更多>>
资源描述

《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

26、WP可实现信号量操作。指令格式如下:SWPcondB Rd,Rm,Rn 其中,B为可选后缀,若有B,则交换字节,否则交换32位字;Rd用于保存从存储器中读入的数据;Rm的数据用于存储到存储器中,若Rm与Rd相同,则为寄存器与存储器内容进行互换;Rn为要进行数据交换的存储器地址,Rn不能与Rd和Rm相同。,ARM存储器访问指令寄存器和存储器交换指令,SWP和SWPB寄存器和存储器交换指令编码,指令执行的条件码,B用于区别无符号字节(B为1)或字(B为0),Rm源寄存器,Rd目标寄存器,Rn为基址寄存器,SWP指令应用示例:SWPR1,R1,R0;将R1的内容与R0指向的存储单元的内容进行互换 S

27、WPBR1,R2,R0;将R0指向的存储单元低字节数据读取到R1中;(高24位清零),并将R2的内容写入到该内存单元中;(最低字节有效),复习,单寄存器数据传送,LDRSTRWord LDRBSTRBByte LDRHSTRHHalfword LDRSB带符号的byte load LDRSH带符号的halfword load存储器系统必须支持所有访问宽度语法:LDR Rd,STR Rd,e.g.LDREQB,地址访问,LDR/STR访问的地址由基址寄存器加上偏移量来产生。针对word和无符号byte 的访问,偏移量可以是:一个无符号12-bit立即数(如 0-4095 bytes).LDR r

28、0,r1,#8一个寄存器,或再加上移位(由立即数指定)LDR r0,r1,r2LDR r0,r1,r2,LSL#2可以是从基址寄存器上加或减去偏移量:LDR r0,r1,#-8LDR r0,r1,-r2LDR r0,r1,-r2,LSL#2对于halfword和带符号的halfword/byte,偏移量可以是:一个无符号8 bit 立即数(如 0-255 bytes).一个寄存器(不能偏移)。可选择采用pre-indexed或post-indexed方式寻址,0 x5,0 x5,r1,0 x200,基址寄存器,0 x200,r0,0 x5,源寄存器for STR,偏移量,12,0 x20c,r

29、1,0 x200,原基址寄存器,0 x200,r0,0 x5,源寄存器for STR,偏移量,12,0 x20c,r1,0 x20c,更新基址寄存器,通过 STR r0,r1,#12!来自动更新基址寄存器,Pre or Post Indexed 寻址?,Pre-indexed:STR r0,r1,#12,Post-indexed:STR r0,r1,#12,LDM/STM指令允许一次传送1到16个寄存器到/从存储器中。寄存器传送顺序不能被指定最小数字的寄存器总是被传送到/从存储器的最低地址上。LDMIAr10,r0,r1,r4基址寄存器指定存储器访问开始的地址块传送指令针对下列情况很有效:从存

30、储器中搬运一块数据保存或恢复堆栈中的内容如果是慢速存储器,会影响中断响应时间,块数据传送,r1,r4,r0,r10,地址增加,LDM/STM 操作,语法:Rb!,4 种寻址操作:LDMIA/STMIAIncrement After(先操作,后增加)LDMIB/STMIBIncrement Before(先增加,后操作)LDMDA/STMDADecrement After(先操作,后递减)LDMDB/STMDBDecrement Before(先递减,后操作),IA,r1,地址增加,r4,r0,r1,r4,r0,r1,r4,r0,r1,r4,r0,r10,IB,DA,DB,LDMxx r10,r

31、0,r1,r4STMxx r10,r0,r1,r4,基址寄存器(Rb),堆栈,100,FF,1234,A0BE,8034,ARM堆栈操作通过块传送指令来完成:STMFD(Push)块存储-Full Descending stack STMDBLDMFD(Pop)块装载-Full Descending stack LDMIA,STMFD sp!,r4-r7,lr,在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。语法:SWPB Rd,Rm,Rn,Rm,Rd,temp,存储器,Rn,SWP,4.2 指令集介绍,ARM指令集分支指令,在ARM中有两种方式可以实

32、现程序的跳转,一种是使用分支指令直接跳转,另一种则是直接向PC寄存器赋值实现跳转。分支指令有以下三种:分支指令B;带链接的分支指令BL;带状态切换的分支指令BX。,ARM分支指令指令编码,分支指令B/BL指令编码格式,指令执行的条件码,L区别B指令(L为0)和BL指令(L为1),24位有符号立即数(偏移量),分支指令BX指令编码格式,指令执行的条件码,Rm目标地址寄存器,该寄存器装载跳转地址,ARM指令分支指令,ARM指令分支指令,分支指令B指令,该指令跳转范围限制在当前指令的32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。指令格式如下:Bcond Label 应用示例:B WA

33、ITA;跳转到WAITA标号处 B0 x1234;跳转到绝对地址0 x1234处,ARM指令分支指令,带链接的分支指令BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR)连接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当前指令的32M字节地址内。指令格式如下:BLcond Label,Addr1,Addr2,1.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC),2.程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行,应用示例(调用子程序):BL

34、 Label,ARM指令分支指令,带状态切换的分支指令BX指令,该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。其跳转范围限制在当前指令的32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。指令格式如下:BXcond Rm,ARM指令分支指令,带状态切换的分支指令BX指令,该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。其跳转范围限制在当前指令的32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。Rm的位0不用作地址的一部分。若Rm的位0为1,则指令将CPSR中的标志T置位,且将目标地址的代码解释为Thumb代码;若Rm的位0为0,则Rm的位1就不能为1。指

35、令格式如下:BXcond Rm,应用示例:ADRL R0,ThumbFun+1;将Thumb程序的入口地址加1存入R0 BX R0;跳转到R0指定的地址,;并根据R0的最低位来切换处理器状态,桶型移位器,Destination,CF,0,Destination,CF,LSL:Logical Left Shift,ASR:Arithmetic Right Shift,(无符号数)乘2,除2,并保留符号位,Destination,CF,.0,Destination,CF,LSR:Logical Shift Right,ROR:Rotate Right,(无符号数)除2,位轮换,Destinatio

36、n,RRX:Rotate Right Extended,位轮换,从 CF到MSB都参与操作,CF,寄存器,可选择是否增加移位操作.移位值可以是:5 bit 无符号整数放在另一个寄存器的低字节用于常数乘法 立即数8 bit,大小范围0-255。右移偶数位允许直接加载32-bit 常数到寄存器中。,结果,桶型移位器:第二个操作数,没有任何一条ARM 指令可包括一个32 bit的立即数所有的ARM指令都是32 bits固定长度数据处理指令格式中,第二个操作数有12位4 bit 移位值(0-15)乘于2,得到一个范围在0-30,步长为 2的移位值。记住一条准则:“最后8位一定要移动偶数位”.,0,7,

37、11,8,immed_8,ShifterROR,rot,x2,Quick Quiz:0 xe3a004ffMOV r0,#?,立即数(1),Examples:下列命令中,汇编器把立即数转换为移位操作:MOV r0,#4096;uses 0 x40 ror 26 ADD r1,r2,#0 xFF0000;uses 0 xFF ror 16也可使用 MVN来进行位反转:MOV r0,#0 xFFFFFFFF;assembles to MVN r0,#0立即数不能使用上述方法产生,否则将导致错误。,0,31,ror#0,range 0-0 xff000000 step 0 x01000000,ror

38、#8,range 0-0 x000000ff step 0 x00000001,range 0-0 x000003fc step 0 x00000004,ror#30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,立即数(2),为允许装载大常数,汇编器提供了一条伪指令:LDR rd,=const它可能汇编成下列指令:MOV or MVN。或LDR 指令,从

39、数据池(Literal pools)读取常数。For exampleLDR r0,=0 xFF=MOV r0,#0 xFFLDR r0,=0 x55555555=LDR r0,PC,#Imm12DCD 0 x55555555建议把常数装载到寄存器中时一律使用该伪指令。,装载32 bit常数,测验#1,1.写一条 ARM 指令,分别完成下列操作:a)r0=16b)r0=r1/16(带符号的数字)c)r1=r2*3d)r0=-r02.下面哪些立即数是数据处理指令中有效的数据?a)0 x00AB0000 b)0 x0000FFFF c)0 xF000000Fd)0 x08000012 e)0 x00

40、001f80 f)0 xFFFFFFFF3.BIC指令做什么用?4.为什么ARM 处理器增加了一条RSB 指令?,Start,Stop,r0=r1?,r0 r1?,r0=r0-r1,r1=r1-r0,Yes,No,Yes,No,你只需要使用CMP、SUB和B指令。充分使用条件执行!大家可以尝试计算 2109 和 4161 的GCD,AREA myarea,CODEENTRYMOV r0,#9MOV r1,#15start;your code herestopB stopEND,测验#2-GCD,新建一个 ARM Executable Image 项目新建一个 text文件另存为“gcd.s”加

41、入到项目中Build 并执行,乘法,语法:MULS Rd,Rm,RsRd=Rm*RsMLAS Rd,Rm,Rs,RnRd=(Rm*Rs)+RnU|SMULLS RdLo,RdHi,Rm,RsRdHi,RdLo:=Rm*RsU|SMLALS RdLo,RdHi,Rm,Rs RdHi,RdLo:=(Rm*Rs)+RdHi,RdLo占用的周期数基本 MUL 指令ARM7TDMI 上为2-5 周期StrongARM/XScale上为1-3 周期ARM9E/ARM102xE上为2 周期ARM9TDMI 比 ARM7TDMI多1 周期 累加再多1 周期(不针对9E,尽管结果延迟多于1周期)对于“long”

42、型数据,多1 周期 以上均为一般规则,确切细节查看相应手册。,软件中断(SWI),产生一个异常陷阱,跳转到SWI 硬件向量。SWI 处理程序可以检测SWI号,从而决定采取何种操作。通过SWI机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。语法:SWI,28,31,24,27,0,Cond 1 1 1 1,SWI number(ignored by processor),23,条件域,PSR 传送指令,MRS和MSR允许传送CPSR/SPSR中的内容到/从一个通用寄存器中。语法:MRS Rd,;Rd=MSR,Rm;=Rm在这里:=CPSR or SPSR_fields=fsx

43、c的任意组合也允许送一个立即数到 psr_fields MSR,#Immediate用户模式下,所有位均可以被读取,但只有条件标志位(_f)可被写。,协处理器指令,ARM体系支持16个协处理器针对每个协处理器的指令占用 ARM指令集中的固定部分 如果相应的协处理器不存在,将发生一个未定义指令异常。这有三种协处理器指令协处理器数据处理指令 CDP:初始化协处理器数据处理操作协处理器寄存器传送指令 MRC:从协处理器寄存器移到ARM 寄存器 MCR:从 ARM 寄存器移到协处理器寄存器协处理器存储器传送指令 LDC:从存储器装载到协处理器寄存器 STC:从协处理器寄存器存储到存储器,测试#4,1.

44、写几条ARM 指令,使能IRQ中断2.下列 ARM 指令将做什么?a)LDRH r0,r1,#6b)LDR r0,=0 x9993.在装载或存储指令中,“!”表示什么?4.当 执行SWI 指令时,会发生什么?5.SWP 指令的优势是什么?,议程,ARM 指令集Thumb 指令集v5TE体系结构扩展,0,15,31,0,ADDS r2,r2,#1,ADD r2,#1,32-bit ARM 指令,16-bit Thumb 指令,对于由编译器产生的大部分指令:没有条件执行源、目的寄存器必须相同仅能使用低寄存器常数大小有限制不能使用在线移位器,Thumb,Thumb 是16-bit 指令集代码密度优化

45、(总代码大小约为ARM指令的65%)使用窄总线存储器时可以大大提高性能。是 ARM 指令集的一个子集。核存在一个执行状态 Thumb状态ARM和Thumb之间切换使用BX 指令,使用Branch Exchange 指令来完成 InterworkingBX Rn;Thumb 状态下的Bx指令BX Rn;ARM状态下的Bx指令也可以只是执行一个绝对跳转,无须状态更换。,ARM/Thumb 交互工作,Rn,BX跳转的地址,31,0,1,31,0,1,ARM/Thumb 选择0-ARM 状态1-Thumb 状态,0,写 Thumb汇编程序,Thumb不是一个“好”指令集!最好用编译器来产生约束并不一致

46、代码处理通常优于ARM 指令更多细节,参看:ARM“Architecture Reference Manual”Chapters A6和A7,议程,ARM 指令集Thumb 指令集v5TE体系结构扩展,v5TE结构,v5TE体系包括全部的 v4T ARM和Thumb 指令集,还有:更支持interworking同时支持ARM/Thumb状态Breakpoint 指令(ARM和Thumb)CLZ(Count Leading Zeros)指令扩展协处理器指令-MCR2等等支持饱和处理封装的带符号的半字乘法指令双字装载/存储指令Cache预装载指令双字协处理器 传送指令-MCRR/MRRC,你采用的

47、处理器是哪种结构?,处理器核结构体系7TDMI&9TDMIv4T9E-S rev1v5TE926EJ-S/1026EJ-Sv5TEJ1020Ev5TEStrongARMv4XScale Microarchitecturev5TE,前导零计数指令,CLZcond Rd,Rm计算寄存器中的值有多少个前导0源寄存器从最高位开始计算。1个周期完成(ARM9E-S/ARM102x)如果没有任何一位被置位,结果是32;如果 bit 31被置位,结果为0。Rm 左移 Rd位即可标准化Rm带符号的标准化需要额外的 1个周期,0000 0010 1110 1101.0,R0=,CLZ R1,R0,0 x6,R1

48、=,1011 1011 0100 0000.0,Rm=,MOV R0,R0 LSL R1,EOR R1,R0,R0,LSL#1CLZ R1,R1MOV R0,R0,LSL R1,扩展协处理器指令,CDP2,LDC2,STC2,MCR2,MRC2新格式的标准协处理器指令为协处理器设计人员提供了附加的操作码空间。同样是无条件执行的,T,Rm,Rs,B,T,B,W option,16,16,16,16,32,16,32/64,32/64,Rd(RdHi,RdLo),Rn(RdHi,RdLo),新的有符号乘法操作,SMULxycond Rd,Rm,RsSMULWycond Rd,Rm,RsSMLAxy

49、cond Rd,Rm,Rs,RnSMLAWycond Rd,Rm,Rs,RnSMLALxycond RdLo,RdHi,Rm,RsSMLA 指令影响标志位Qx,y 用于选择寄存器的高一半和低一半W 用于选择48位结果的高32位 不影响 NZCV(没有S位),1)写一段汇编代码 qtest 测试标志位 Q 并清零。源文件模板在文件 asmdsp.s 中给出返回根据标志位Q的值 2)写一段汇编主程序,累加16位有符号数组的所有元素的平方。int total=0;for(n=0;n64;n+)total+=xn*xn;取值指令 使用LDRH平方累加指令使用 SMLABB3)是否存在互锁?4)使用AX

50、D检查 Q标志位(通过改变cpsr模式为 E-PSR)5)在循环后面增加一个 BL 调用 qtest 并检查返回值6)专家题:改用 LDR,每次取两个值7)专家题:修改代码,使用64位累加器,测试#5-DSP power calculation,x,x0,x1,x2,x3,x4,x63,r0,x62,x5,饱和算术,0 x7FFFFFFF 加上1产生一个负的结果0 x80000000 减去1,会产生一个正的结果饱和算术指令会区分这两种情况,使得在最大值和最小值越界时产生饱和经常用于表示 1 到-1“Q31”算术AXD 可以显示 Q31 格式,0 x0,0 x7FFFFFFF,0 x800000

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号