ARM微处理器的指令系统教学PPT.ppt_第1页
ARM微处理器的指令系统教学PPT.ppt_第2页
ARM微处理器的指令系统教学PPT.ppt_第3页
ARM微处理器的指令系统教学PPT.ppt_第4页
ARM微处理器的指令系统教学PPT.ppt_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.3arm微处理器的指令系统,3.3.1指令集概述3.3.2寻址方式3.3.3指令集,3.3.1指令集概述,指令长度指令集可以是以下任一种32bits长(arm状态)16bits长(thumb状态)arm7tdmi支持3种数据类型字节(8-bit)半字(16-bit)字(32-bit)字必须被排成4个字节边界对齐,半字必须被排列成2个字节边界对齐,arm指令集的特点,向后兼容:新版本增加指令,并保持指令向后兼容;load-store结构*load/store从存储器中读某个值,操作完后再将其放回存储器中只对存放在寄存器的数据进行处理;对于存储器中的数据,只能使用load/store指令进行存取,指令格式,指令格式在arm状态中使用,指令编码格式,cond指令执行的条件编码opcode指令操作符编码s决定指令的操作是否影响cpsr的值rd操作目标寄存器编码rn包含第一操作数的寄存器编码shifter_operand表示第二操作数,条件码标志,任何数据处理指令都可以设置条件码(n,z,v,andc)适用于除比较操作外的所有数据处理指令特殊的请求必须在汇编语言中实现,这种请求是通过把”s”增加到选择代码中指定的算术操作设置所有的标志位(n,z,c,andv)逻辑和移位操作设置nandz,条件码标志,下表为所有可能的条件码:注意:al为默认状态,不需要单独指出,条件执行示例,一系列的指令都使用条件指令if(a=0)func(1);cmpr0,#0moveqr0,#1;把func()函数的参数赋给r0bleqfunc置标志位,再使用不同的条件码if(a=0)x=0;r0:a,r1:xif(a0)x=1;cmpr0,#0moveqr1,#0movgtr1,#1使用条件比较指令if(a=4|a=10)x=0;cmpr0,#4cmpner0,#10moveqr1,#0,桶形移位器,桶形移位器的使用:支持第二操作数的移位,逻辑移位:空位以零补充lsl:逻辑左移:字的最小位空位清零lsr:逻辑右移:字的最大位空位清零.,算术移位:asr:=lsrasl:算术左移,算术移位的对象是带符号数,在移位过程中必须保持操作数的符号不变。若源操作数为正数,则字的高端空出的位补0。若源操作数为负数,则字的高端空出的位补1。,循环移位:ror:循环右移(rotateright)。从字的最低端移出的位填入字的高端空出的位。rrx:扩展为1的循环右移(rotaterightextendedby1place)。操作数右移一位,空位(位31)用原c标志填充。,数据处理指令,立即数操作:移位寄存器操作数第二个操作数在与第一个操作数合成之前,是服从于移位操作的.,arm指令分类,存储器访问指令把存储器的值拷贝到寄存器中(load)or把寄存器中的值拷贝到存储器中(store)数据处理指令使用和改变寄存器的值控制流指令分支分支和链接,保存返回的地址,以恢复最先的次序软件中断指令程序状态寄存器指令协处理器指令,3.3.2寻址方式,寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。arm处理器具有9种基本寻址方式。寻址方式分类:1.寄存器寻址;2.立即数寻址;3.寄存器移位寻址;4.寄存器间接寻址;5.基址寻址;6.多寄存器寻址;7.堆栈寻址;8.块拷贝寻址;9.相对寻址。,操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:movr1,r2;将r2的值存入r1subr0,r1,r2;将r1的值减去r2的值,结果保存到r0,movr1,r2,0 xaa,寻址方式分类寄存器寻址,立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:subsr0,r0,#1;r0减1,结果放入r0,并且影响标志位movr0,#0 xff000;将立即数0 xff000装入r0寄存器,寻址方式分类立即寻址,movr0,#0 xff00,0 xff00,从代码中获得数据,寄存器移位寻址是arm指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:movr0,r2,lsl#3;r2的值左移3位,结果放入r0,;即是r0=r28andsr1,r1,r2,lslr3;r2的值左移r3位,然后和r1相;“与”操作,结果放入r1,寻址方式分类寄存器移位寻址,movr0,r2,lsl#3,0 x08,0 x08,逻辑左移3位,寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:ldrr1,r2;将r2指向的存储单元的数据读出;保存在r1中swpr1,r1,r2;将寄存器r1的值和r2指定的存储;单元的内容交换,寻址方式分类寄存器间接寻址,ldrr0,r2,0 xaa,基址寻址就是将基址寄存器的内容与指令中给出的偏移量(srd,n,pre:r0=8,r2=5movr0,r2,lsl#2(逻辑左移两位:r22=5*4)post:r0=20,r2=5,例:pre:r0=5,r2=6movr0,r2post:r0=6,r2=6,2)数据处理指令,立即数操作:移位寄存器操作数第二个操作数在与第一个操作数合成之前,是服从于移位操作的.,任何数据处理指令都可以设置条件码(n,z,v,andc)适用于除比较操作外的所有数据处理指令特殊的请求必须在汇编语言中实现,这种请求是通过把”s”增加到选择代码中指定的算术操作设置所有的标志位(n,z,c,andv)逻辑和移位操作设置nandz,3)乘法指令集,在寄存器产生32位值,例子(乘法,乘法累加器)注意最低32-bits置于结果寄存器中,其余被忽略不支持第二立即操作数结果寄存器与源寄存器必须不同,(4)控制和分支指令,在arm中有两种方式可以实现程序的跳转,一种是使用分支指令直接跳转,另一种则是直接向pc寄存器赋值实现跳转。分支指令有以下三种:1)分支指令b;2)带链接的分支指令bl;3)带状态切换的分支指令bx。,arm分支指令指令编码,分支指令b/bl指令编码格式,指令执行的条件码,l区别b指令(l为0)和bl指令(l为1),24位有符号立即数(偏移量),分支指令bx指令编码格式,指令执行的条件码,rm目标地址寄存器,该寄存器装载跳转地址,arm指令分支指令,1)分支指令b,分支指令b指令,该指令跳转范围限制在当前指令的32m字节地址内(arm指令为字对齐,最低2位地址固定为0)。指令格式如下:bcondlabel应用示例:bwaita;跳转到waita标号处b0 x1234;跳转到绝对地址0 x1234处,2)带链接的分支指令bl,带链接的分支指令bl指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到r14(即lr)连接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当前指令的32m字节地址内。指令格式如下:blcondlabel,1.当程序执行到bl跳转指令时,硬件将下一条指令的地址addr2装入lr寄存器,并把跳转地址装入程序计数器(pc),程序跳转到目标地址label继续执行,当子程序执行结束后,将lr寄存器内容存入pc,返回调用函数继续执行,应用示例(调用子程序):bllabel,3)带状态切换的分支指令,带状态切换的分支指令bx指令,该指令可以根据跳转地址(rm)的最低位来切换处理器状态。指令格式如下:bxcondrm,arm指令分支指令,带状态切换的分支指令bx指令,该指令可以根据跳转地址(rm)的最低位来切换处理器状态。rm的位0不用作地址的一部分。若rm的位0为1,则指令将cpsr中的标志t置位,且将目标地址的代码解释为thumb代码;若rm的位0为0,则rm的位1就不能为1。指令格式如下:bxcondrm,应用示例:adrlr0,thumbfun+1;将thumb程序的入口地址加1存入r0bxr0;跳转到r0指定的地址,;并根据r0的最低位来切换处理器状态,分支和链接指令,分支子程序(r14servesasalinkregister)嵌套子程序,fulldescending,(4)软件中断(swi),产生一个异常陷阱,跳转到swi硬件向量。swi处理程序可以检测swi号,从而决定采取何种操作。通过swi机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。语法:swi,软件中断(swi)执行的操作,swi中断处理程序,处理软件中断的代码段称为中断处理程序(swihandler),中断处理程序是通过执行指令的地址获取软件中断号,指令地址是从lr计算出来的;swi号的确定方法:swi_number=andnot(0 xff000000),0,swi处理程序应用示例,swi_handler;保存寄存器r0r12和lrstmfdsp!,r0-r12,lr;readtheswiinstructionldrr10,lr,#-4;makeofftop8bitsbicr10,r10,#0 xff000000;r10-containstheswinumberblservice_routine;returnfromswihandlerldmfdsp!,r0-r12,pc,在swi异常中断处理程序中,取出swi指令中立即数的步骤为:首先确定引起软中断的swi指令是arm指令还是thumb指令,这可通过对spsr访问得到;然后取得该swi指令的地址,这可通过访问lr寄存器得到;接着读出该swi指令,分解出立即数。,swi_handlerstmfdsp!,r0-r3,r12,lr;现场保护mrsr0,spsr;读取spsrstmfdsp!,r0;保存spsrtstr0,#0 x20;测试t标志位ldrnehr0,lr,#-2;若是thumb指令,读取指令码(16位)bicner0,r0,#0 xff00;取得thumb指令的8位立即数(低8位)ldreqr0,lr,#-4;若是arm指令,读取指令码(32位)biceqr0,r0,#0 xff000000;取得arm指令的24位立即数(低23位).ldmfdsp!,r0-r3,r12,pc;swi异常中断返回,ne:z=0eq:z=1,(5)程序状态寄存器访问指令,程序状态寄存器访问指令(mrs,msr)mrs程序状态寄存器到通用寄存器的数据传送指令msr通用寄存器到程序状态寄存器的数据传送指令,psr传送指令,mrs和msr允许传送cpsr/spsr中的内容到/从一个通用寄存器中。语法:mrsrd,;rd=msr,rm;=rm在这里:=cpsrorspsr_fields=fsxc的任意组合也允许送一个立即数到psr_fieldsmsr,#immediate用户模式下,所有位均可以被读取,但只有条件标志位(_)可被写。,状态寄存器访问指令示例,在arm处理器中,只有msr指令可以对状态寄存器cpsr和spsr进行写操作。与mrs配合使用,可以实现对cpsr或spsr寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止irq/fiq中断等。,(6)协处理器指令-1,协处理器一般原理是通过增加核扩展指令集example:如mmu加载转换表地址ldrbr1,r0,r2;使用r2作为参数,进行查表disp_tab:dcb0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,2)arm伪指令中等范围的地址读取,adrl伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比adr伪指令可以读取更大范围的地址。编译源程序时,adrl伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-64k64k;当地址值是字对齐时,其取指范围为-256k256k;,.adrlr0,delay.delaymovr0,r14.,应用示例(源程序):,使用伪指令将程序标号delay的地址存入r0,adrl伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比adr伪指令可以读取更大范围的地址。编译源程序时,adrl伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,2)arm伪指令中等范围的地址读取,.adrlr0,delay.delaymovr0,r14.,应用示例(源程序):,.0 x20addr0,pc,#400 x24addr0,r0,#ff00.0 xff68movr0,r14.,编译后的反汇编代码:,使用伪指令将程序标号delay的地址存入r0,地址,程序代码,adrl伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比adr伪指令可以读取更大范围的地址。编译源程序时,adrl伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,2)arm伪指令中等范围的地址读取,.adrlr0,delay.delaymovr0,r14.,应用示例(源程序):,.0 x20addr0,pc,#400 x24addr0,r0,#ff00.0 xff68movr0,r14.,编译后的反汇编代码:,使用伪指令将程序标号delay的地址存入r0,adrl伪指令被汇编成两条指令,adrl伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比adr伪指令可以读取更大范围的地址。编译源程序时,adrl伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,2)arm伪指令中等范围的地址读取,3)arm伪指令大范围的地址读取,ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。,注意:1.从指令位置到文字池的偏移量必须小于4kb;2.与arm指令的ldr相比,伪指令的ldr的参数有“=”号。,应用示例(加载常量):,ldrr2,=0 xff0;movr2,#0 xff0ldrr0,=0 xff000000;movr0,#0 xff000000ldrr1,=0 xfffffffe;mvnr1,#0 x1,ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。,3)arm伪指令大范围的地址读取,应用示例(加载地址):,.ldrr1,=initstack.initstackmovr0,lr.,使用伪指令将程序标号initstack的地址存入r1,ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。,3)arm伪指令大范围的地址读取,应用示例(加载地址):,编译后的反汇编代码:,.ldrr1,=initstack.initstackmovr0,lr.,.0 x60ldrr1,0 xb4.0 x64movr0,lr.0 xb4dcd0 x64,使用伪指令将程序标号initstack的地址存入r1,地址,程序代码,ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。,3)arm伪指令大范围的地址读取,应用示例(加载地址):,编译后的反汇编代码:,.ldrr1,=initstack.initstackmovr0,lr.,.0 x60ldrr1,0 xb4.0 x64movr0,lr.0 xb4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论