《第4章 ARM指集系统(2).ppt》由会员分享,可在线阅读,更多相关《第4章 ARM指集系统(2).ppt(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1TM13.2指令集介绍指令集介绍nARM指令集指令集存储器访问指令存储器访问指令 ARM处理器是典型的RISC处理器,对存储器的访问只能使用加载和存储指令实现。ARM处理器是冯诺依曼存储结构,程序空间、RAM空间及I/O映射空间统一编址,除对RAM操作以外,对外围IO、程序数据的访问均要通过加载/存储指令进行。存储器访问指令分为单寄存器操作指令和多寄存器操作指令。2TM2 LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。若使用LDR指令加载数据到PC寄存器,则实现程序跳转功能,这样也就实现了程序散转。3.2指令集介绍指令集介绍nARM存储器访问指令存
2、储器访问指令单寄存器存取单寄存器存取3TM33.2指令集介绍指令集介绍nARM存储器访问指令存储器访问指令单寄存器存取单寄存器存取装载指令:LDR 目标寄存器目标寄存器,源地址源地址存储指令:STR 源寄存器源寄存器,目标地址目标地址存储器源地址目标寄存器存储器目标地址源寄存器4TM43.2指令集介绍指令集介绍nARM存储器访问指令存储器访问指令单寄存器存取单寄存器存取装载指令:LDR存储指令:STRxxLDR/STR指令搭配不同的后缀实现不同方式的单寄存器存取操作:字/半字/字节数据控制是/否用户模式控制无/有符号控制5TM5常用的加载存储指令如下:常用的加载存储指令如下:nLDR字数据加载
3、指令字数据加载指令nLDRB字节数据加载指令字节数据加载指令nLDRH半字数据加载指令半字数据加载指令nSTR字数据存储指令字数据存储指令nSTRB字节数据存储指令字节数据存储指令nSTRH半字数据存储指令半字数据存储指令6TM6ARM存储器访问指令地址形式装载指令:LDR LDR 目标寄存器目标寄存器,源地址源地址保存指令:STR STR 源寄存器源寄存器,目标地址目标地址立即数:立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,R0,#0 x12 寄存器:寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LD
4、R R1,R0,R2 寄存器及移位常数:寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,R0,R2,LSL#27TM7ARM存储器访问指令寻址方式装载指令:LDR LDR 目标寄存器目标寄存器,源地址源地址保存指令:STR STR 源寄存器源寄存器,目标地址目标地址零偏移:如:LDR Rd,Rn前索引偏移:如:LDR Rd,Rn,#0 x04!程序相对偏移:如:LDR Rd,labe1 后索引偏移:如:LDR Rd,Rn,#0 x04注注意意:大多数情况下,必须保证字数据操作的地址是32位对齐的。8TM80 x55R2R5 0 x400000000 x1
5、23456780 x40000000存储器地址应用示例:LDRR2,R5 ;将R5指向地址的字数据存入R20 x12345678ARM存储器访问指令单寄存器加载应用9TM90 x12345678R1R2 0 x400000000 x?0 x40000004存储器地址应用示例:STRR1,R2,#0 x04 ;将R1的数据存储到R0+0 x04地址0 x12345678+4ARM存储器访问指令单寄存器存储应用10TM10nARM微处理器所支持批量数据加载微处理器所支持批量数据加载/存储指令可以一存储指令可以一次性实现一片连续的存储器单元和多个寄存器之间次性实现一片连续的存储器单元和多个寄存器之间
6、进行传送数据。进行传送数据。n批量数据加载指令用于将一片连续的存储器中的数批量数据加载指令用于将一片连续的存储器中的数据传送到多个寄存器中,批量数据存储指令能够实据传送到多个寄存器中,批量数据存储指令能够实现将多个寄存器中的内容一次性的存放到一片连续现将多个寄存器中的内容一次性的存放到一片连续的存储器中。的存储器中。11TM11nARM存储器访问指令存储器访问指令批量数据加载批量数据加载/存储指令存储指令装载指令:LDM 源地址源地址,目标寄存器列表目标寄存器列表存储指令:STM 目标地址目标地址,源寄存器列表源寄存器列表存储器源地址目标寄存器1目标寄存器n存储器目标地址源寄存器1源寄存器n1
7、2TM12nARM存储器访问指令存储器访问指令批量数据加载批量数据加载/存储指令存储指令装载指令:LDM存储指令:STMxxLDM/STM指令搭配不同的后缀实现不同方式地址增长方式:IA:每次传送后地址加4IB:每次传送前地址加4DA:每次传送后地址减4DB:每次传送前地址减413TM13ARM存储器访问指令批量数据加载批量数据加载/存储指令存储指令数据块传送指令操作过程如右图所示,其中R1为指令执行前的基址寄存器,R1则为指令执行后的基址寄存器。R5R6R7R1 R1 指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令S
8、TMDA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMIB R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDB R1!,R5-R74008H4004H4000H4014H4010H400CH14TM140 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器0 x010 x020 x030 x040 x40000
9、010应用示例:LDMIA R1!,R2-R4,R6 将R1指向的内存数据读取到R0-R4和R6寄存器中ARM存储器访问指令批量数据加载/存储指令15TM15示例解析示例解析nMOVR1,#0 x9000nMOVR0,#0 x11nMOVR2,#0 x22nMOVR3,#0 x33nMOVR4,#0 x44nMOVR5,#0 x55nSTMDB R1!,R0,R2-R516TM16存储情况如下存储情况如下17TM17带带PSR操作的批量字数据加载指令操作的批量字数据加载指令n在带在带PSR操作的批量字数据加载指令中,程操作的批量字数据加载指令中,程序计数器序计数器PC包含在指令寄存器列表中。包
10、含在指令寄存器列表中。n该指令将数据从连续的内存单元中读取到指该指令将数据从连续的内存单元中读取到指令中寄存器列表中的各寄存器中。它同时将令中寄存器列表中的各寄存器中。它同时将目前处理器模式对应的目前处理器模式对应的SPSR寄存器内容复寄存器内容复制到制到CPSR寄存器中。寄存器中。18TM18示例解析:示例解析:n如何用带如何用带PSR操作的批量字数据加载指令实现操作的批量字数据加载指令实现IRQ中断的返回?中断的返回?n在进入在进入IRQ中断处理程序时,首先计算返回地址,并保存相关的寄存器中断处理程序时,首先计算返回地址,并保存相关的寄存器nSUBR14,R14,#4;nSTMFDR13!
11、,R0-R3,R12,LRn如果如果IRQ中断处理程序返回到被中断的进程则执行下面的指令。该指令中断处理程序返回到被中断的进程则执行下面的指令。该指令从数据栈中恢复寄存器从数据栈中恢复寄存器R0R3及及R12的值,将返回地址传送到的值,将返回地址传送到PC中,并中,并将将SPSR_irq值复制到值复制到CPSR中中nLDMFDR13!,R0-R3,R12,PC19TM19 SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。ARM存储器访问指令寄存器和存储器交换指令20TM20ARM存储器访问指令寄存器和存储器
12、交换指令装载指令:SWP SWP 读入寄存器读入寄存器,输出寄存器输出寄存器,目标地址目标地址存储器目标地址读入寄存器输出寄存器21TM210 x12345678R1R20 x?0 x112233440 x40000000存储器地址R0 0 x40000000ARM存储器访问指令寄存器和存储器交换指令应用示例:SWPR2,R1,R0将R1的内容与R0指向的存储单元的内容进行交换0 x123456780 x1122334422TM22n指令示例:指令示例:SWPR0,R0,R1;该指令完成将该指令完成将R1所指向的存储所指向的存储器中的字数据与器中的字数据与R0中的字数据交换。中的字数据交换。2
13、3TM234.6程序状态寄存器程序状态寄存器PSR访问指令访问指令n程序状态寄存器程序状态寄存器PSR访问指令用来实现通用访问指令用来实现通用寄存器与程序状态寄存器之间的数据传输,寄存器与程序状态寄存器之间的数据传输,共有两条:读程序状态寄存器指令共有两条:读程序状态寄存器指令MRS和写和写程序状态寄存器指令程序状态寄存器指令MSR。n这类指令可以用来修改这类指令可以用来修改CPSR,通常是通过,通常是通过“读取读取-修改修改-写回写回”的操作序列来实现。的操作序列来实现。24TM24读程序状态寄存器指令读程序状态寄存器指令nMRS指令用于将状态寄存器的内容传送到通指令用于将状态寄存器的内容传
14、送到通用寄存器中。这是程序获得程序状寄存器用寄存器中。这是程序获得程序状寄存器PSR数据的唯一方法。数据的唯一方法。nMRS,CPSRnMRS,SPSR25TM25写程序状态寄存器指令写程序状态寄存器指令nMSR指令用于将通用寄存器的内容或一个立即数传指令用于将通用寄存器的内容或一个立即数传送到程序状态寄存器中,实现对程序状态寄存器的修送到程序状态寄存器中,实现对程序状态寄存器的修改。改。MSR CPSR_,MSR SPSR_,26TM26nfields设置状态寄存器中需要操作的位域。状态寄存器分为设置状态寄存器中需要操作的位域。状态寄存器分为4个个8位的域:位的域:bits31:24为条件标
15、志位域,用为条件标志位域,用f表示;表示;bits23:16状态位域,用状态位域,用s表示;表示;bits15:8扩展位域,用扩展位域,用x表示;表示;bits7:0控制位域,用控制位域,用c表示;表示;27TM27n第二操作数第二操作数operand2的构成形式有以下两种形式:的构成形式有以下两种形式:n为将要传送到状态寄存器中的立即数;为将要传送到状态寄存器中的立即数;n寄存器包含将要传送到状态寄存器中的数据。寄存器包含将要传送到状态寄存器中的数据。nR(bit22)为)为0时,写时,写CPSR;R(bit22)为)为1时,写时,写SPSR。28TM283.2指令集介绍指令集介绍nARM指
16、令集指令集状态寄存器写指令状态寄存器写指令示例,将R0的内容写入CPSR寄存器的控制位域MSR CPSR_c,R0“MSR”条件代码标志保留控制位域Byte0Byte3,Byte2,Byte1R0CPSRNZCV IM0M1M2M3M4TF.31 30 29 28 27 26 8 7 6 5 4 3 2 1 0Byte029TM29ARM状态寄存器写指令“MSR”启动代码堆栈初始化应用示例:INITSTACKMOV R0,LR;设置管理模式堆栈MSR CPSR_C,#0 xD3LDR SP,StackSvc;设置中断模式堆栈MSR CPSR_C,#0 xD2LDR SP,StackIrq.模式
17、位状态位IRQ禁止位FIQ禁止位NZCVIFT M4 M3 M2 M1 M031 30 29 28 27 2676543210配置值0 xD2 211010010禁止FIQ中断禁止IRQ中断ARM状态IRQIRQ模式MSR CPSR_C,#0 xD2CPRS寄存器30TM304.8异常产生指令异常产生指令nARM处理器所支持的异常产生指令有两条:处理器所支持的异常产生指令有两条:n软中断指令软中断指令SWIn断点调试指令断点调试指令BKPT(用于(用于ARMV5及以上的及以上的版本)版本)31TM31软中断指令软中断指令nSWI(SoftWareInterrupt)指令用于产生软件指令用于产生
18、软件中断,它将处理器置于监控模式中断,它将处理器置于监控模式(SVC),从,从地址地址0 x08开始执行指令。开始执行指令。nARM通过这种机制实现用户模式对操作系统通过这种机制实现用户模式对操作系统中特权模式的程序调用,也就是使用户程序中特权模式的程序调用,也就是使用户程序调用操作系统的系统程序成为可能。调用操作系统的系统程序成为可能。32TM32用户模式管理模式任务1任务2其它代码功能1:打开中断功能2:关闭中断功能n:任务调度CPSR寄存器SPSR寄存器1.使用操作系统后,为了防止出错的任务影响其它任务的执行,通常将任务放在用户模式执行,以限制其权限;2.对于一些重要的操作,如中断的开关
19、,必须由操作系统完成。使用软件中断指令即可完成系统功能调用;软中断指令33TM33nSWI,n操作系统在操作系统在SWI的异常处理程序中提供相应的系统服务,指的异常处理程序中提供相应的系统服务,指令中令中24位的立即数指定用户程序调用系统例程的类型,相关位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递。参数通过通用寄存器传递。34TM34n执行过程:执行过程:n将将SWI后面指令地址保存到后面指令地址保存到R14_svc;n将将CPSR保存到保存到SPSR_svc;n进入监控模式进入监控模式,将将CPSR4:0设置为设置为0b10011的将的将CPSR7设置为设置为1,禁止
20、禁止IRQ;n将将PC设置为设置为0 x08,并且开始执行那里的指令。并且开始执行那里的指令。n返回时:返回时:MOVSPC,R1435TM35软件中断软件中断SWIn汇编格式如下:汇编格式如下:nSWI n指令示例:指令示例:SWI0 x02;该指令调用操作系统编号位;该指令调用操作系统编号位02的系统例程。的系统例程。36TM36软中断指令传递参数方法 根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理。SWI指令传递参数有以下两种方法,指令中的24位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。MOV R0,#34;设置子功能号为34 SWI 12;调用12号软中断
21、指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其它的通用寄存器传递。MOV R0,#12;调用12号软中断 MOV R1,#34;设置子功能号为34 SWI 0 37TM37断点中断指令断点中断指令nBKPT(BreakPoinT)指令产生软件断点中断,指令产生软件断点中断,可用于程序的调试。当可用于程序的调试。当BKPT指令执行时,处指令执行时,处理器停止执行下面的指令并进入相应的理器停止执行下面的指令并进入相应的BKPT入口程序入口程序38TM38nBKPTnimmed_16为为16位的立即数,此立即数被调位的立即数,此立即数被调试软件用来保存额外的断点信息。
22、试软件用来保存额外的断点信息。39TM39ARM指令练习指令练习40TM40请指出以下指令的含义请指出以下指令的含义n1ADDR0,R1,R2;n2LDRR0,R1,#4;n3LDMIAR13,R1,R2,R3,R4;n4STRR0,R1;41TM41请指出以下指令的含义请指出以下指令的含义n5RSBR0,R1,#256;n6ANDR0,R0,3;n7BICR0,R0,1011;;42TM42n算术逻辑运算指令的应用算术逻辑运算指令的应用n1.位操作指令应用位操作指令应用nMOVR0,R2,LSR#24nORRR3,R0,R3,LSL#843TM43n将将r2中的高中的高8位数据传送到位数据传
23、送到r3的低的低8位中位中nMOVR0,R2,LSR#24nORRR3,R0,R3,LSL#844TM44n2.实现乘法的指令段实现乘法的指令段nMOVR0,R0,LSL#1;nADDR0,R0,R0,LSL#1;nMOVR0,R0,LSL#n;nADDR0,R0,R0,LSL#n;ARM指令的特色:两个操作在一条指令中完成。指令的特色:两个操作在一条指令中完成。45TM45n2.实现乘法的指令段实现乘法的指令段nMOVR0,R0,LSL#1;2*R0nADDR0,R0,R0,LSL#1;3*R0nMOVR0,R0,LSL#n;2n*R0nADDR0,R0,R0,LSL#n;(2n+1)*R0
24、ARM指令的特色:两个操作在一条指令中完成。指令的特色:两个操作在一条指令中完成。46TM46n3.64位数据运算位数据运算nR0,R1存放存放64位数据的低位数据的低32位和高位和高32位;位;R2,R3存放存放64位数据的低位数据的低32位和高位和高32位:位:nADDSR0,R0,R2nADCR1,R1,R3;64位加法位加法nSUBSR0,R0,R2nSBCR1,R1,R3;64位减法位减法nCMPR1,R3nCMPEQR0,R2;64位数据比较位数据比较注意注意:进位标志进位标志C在在 CPSR中。中。47TM47n如何用如何用ARM汇编指令实现一个汇编指令实现一个for循环?循环?
25、48TM48n4.循环语句循环语句n对于一个对于一个for或或while循环:循环:MOVR0,#loopcount;初始化计数器初始化计数器loop;SUBSR0,R0,#1;计数器的更新及CPSR的更新BNEloop;注意:此时注意:此时SUB指指令必需带后缀令必需带后缀S。49TM49nMRSR0,CPSRnBICR0,R0,#0 x1FnORRR0,R0,#0 x13nMSRCPSR_c,R05.CPSR寄存器读写寄存器读写什么含义?什么含义?50TM50n6.简单的串比较简单的串比较n比较两个串的大小:比较两个串的大小:R0指向第一个串,指向第一个串,R1指向第二个串。指向第二个串。
26、strcmpLDRBR2,R0,#1;注意字符寻址的偏移量注意字符寻址的偏移量LDRBR3,R1,#1CMPR2,#0CMPNER3,#0BEQreturnCMPR2,R3BEQstrcmpreturnSUBR0,R2,R3;比较两字符的大小比较两字符的大小MOVPC,LR51TM51n7 AREA StrCopy,CODE,READONLY ENTRY start MOV R1,#0 x1000h;MOV R0,#0 x3000h ;MOV R2,#0 x31h ;BL strcopy;stop MOV r0,#0 x18;LDR r1,=0 x20026 SWI 0 x123456 52T
27、M52Strcopy LDRB R3,R1,#1;STRB R3,r0,#1;SUBS R2,#1;CMP R2,#0;BNE strcopy;MOV pc,lr;END53TM53n7 数据串拷贝数据串拷贝 AREA StrCopy,CODE,READONLY ENTRY start MOV R1,#0 x1000h;指向源串指向源串 MOV R0,#0 x3000h ;指向目的串指向目的串 MOV R2,#0 x31h ;计数器计数器 BL strcopy;调用串拷贝子程序调用串拷贝子程序 stop MOV r0,#0 x18;执行中止执行中止 LDR r1,=0 x20026 SWI 0
28、 x123456 54TM54Strcopy LDRB R3,R1,#1;装载字节同时更新地址装载字节同时更新地址 STRB R3,r0,#1;存储字节同时更新地址存储字节同时更新地址SUBS R2,#1;计数器减计数器减1 CMP R2,#0;判断是否结束判断是否结束 BNE strcopy;不是,则继续不是,则继续 MOV pc,lr;返回返回END55TM55n8.条件判断语句(条件判断语句(C语言代码)语言代码)if(a=0|b=1)c=d+e;如何用如何用ARM指令来实现指令来实现?56TM56n代码执行前代码执行前r0中存放中存放a,r1中存放中存放b;代码执;代码执行后行后r2中
29、存放中存放d和和e的和:的和:CMPR0,#0CMPNER1,#1ADDEQR2,R3,R4注意:两个条件按顺序进行判断,如果第一个条件不成立,则后面的条件无需进行判断。57TM57n9批量批量load/store指令的应用指令的应用n一次将一次将48个字数据从个字数据从R12作为首地址的一段连作为首地址的一段连续的内存单元复制到续的内存单元复制到R13作为首地址的一段连续作为首地址的一段连续的内存单元。的内存单元。R14为源数据区末地址。为源数据区末地址。loopLDMIAR12!,R0-R11;每次每次12个字个字STMIAR13!,R0-R11CMPR12,R14;判断是否结束判断是否结
30、束BLOloop思考:当数据块大小不是一思考:当数据块大小不是一次搬移数据的倍数时,程序次搬移数据的倍数时,程序如何设计?如何设计?58TM58n1.已知 R0=8,R2=5,执行MOV R0,R2,LSL#2 后,r0=?,r2=?n2.已知 r0=0 x00000000,r1=0 x00009000,men320 x00009000=0 x01010101,mem320 x00009004=0 x02020202 问执行以下指令后,r1,r0 的情况 1)ldr r0,r1,#0 x4!2)Ldr r0,r1,#0 x4 3)Ldr r0,r1,#0 x459TM59n3.已知 men32
31、0 x80018=0 x03,men320 x80014=0 x02,men320 x80010=0 x01,r0=0 x00080010,r1=0 x00000000,r2=0 x00000000,r3=0 x00000000 问执行ldmia r0!,r1-r3后,r0,r1,r2,r3 的情况60TM60n4.已知 r1=0 x00000002,r4=0 x00000003,sp=0 x00080014,问执行stmfd sp!,r1,r4后,r1,r4,sp 的情况n5.已知 r0=0 x0,cpsr=0 xd3,执行以下指令后r0 的情况 MRS r0,cpsr BIC r0,r0,
32、#0 x8061TM61思考与练习题思考与练习题n写出写出LDRB指令与指令与LDRSB指令二进制编码格式,并指出它们之间的区别。指令二进制编码格式,并指出它们之间的区别。n分析下列每条语句的功能,并确定程序段所实现的操作。分析下列每条语句的功能,并确定程序段所实现的操作。nCMPR0,#0MOVEQR1,#0MOVGTR1,#1n请使用多种方法实现将字数据请使用多种方法实现将字数据0 xFFFFFFFF送入寄存器送入寄存器R0。n写一条写一条ARM指令,分别完成下列操作:指令,分别完成下列操作:na)R0=16nb)R0=r1/16(带符号的数字带符号的数字)nc)R1=r2*3nd)R0=-R062TM第第4章章ARM指令集系统指令集系统TheEnd