欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    ARM微处理器的指令系统教学PPT.ppt

    • 资源ID:2202713       资源大小:1.49MB        全文页数:90页
    • 资源格式: PPT        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    ARM微处理器的指令系统教学PPT.ppt

    3.3 ARM微处理器的指令系统,3.3.1 指令集概述3.3.2 寻址方式3.3.3 指令集,3.3.1 指令集概述,指令长度指令集可以是以下任一种32 bits 长(ARM状态)16 bits 长(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,and C)适用于除比较操作外的所有数据处理指令特殊的请求必须在汇编语言中实现,这种请求是通过把”S”增加到选择代码中指定的算术操作设置所有的标志位(N,Z,C,and V)逻辑和移位操作设置 N and Z,条件码标志,下表为所有可能的条件码:注意:AL为默认状态,不需要单独指出,条件执行示例,一系列的指令都使用条件指令if(a=0)func(1);CMP r0,#0MOVEQ r0,#1;把func()函数的参数赋给r0 BLEQ func置标志位,再使用不同的条件码if(a=0)x=0;r0:a,r1:x 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,桶形移位器,桶形移位器的使用:支持第二操作数的移位,逻辑移位:空位以零补充LSL:逻辑左移:字的最小位空位清零LSR:逻辑右移:字的最大位空位清零.,算术移位:ASR:=LSRASL:算术左移,算术移位的对象是带符号数,在移位过程中必须保持操作数的符号不变。若源操作数为正数,则字的高端空出的位补0。若源操作数为负数,则字的高端空出的位补1。,循环移位:ROR:循环右移(Rotate Right)。从字的最低端移出的位填入字的高端空出的位。RRX:扩展为1的循环右移(Rotate Right Extended by 1 place)。操作数右移一位,空位(位31)用原C标志填充。,数据处理指令,立即数操作:移位寄存器操作数第二个操作数在与第一个操作数合成之前,是服从于移位操作的.,ARM指令分类,存储器访问指令 把存储器的值拷贝到寄存器中(load)or 把寄存器中的值拷贝到存储器中(store)数据处理指令 使用和改变寄存器的值控制流指令 分支分支和链接,保存返回的地址,以恢复最先的次序软件中断指令程序状态寄存器指令协处理器指令,3.3.2 寻址方式,寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。寻址方式分类:1.寄存器寻址;2.立即数寻址;3.寄存器移位寻址;4.寄存器间接寻址;5.基址寻址;6.多寄存器寻址;7.堆栈寻址;8.块拷贝寻址;9.相对寻址。,操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOV R1,R2;将R2的值存入R1 SUB R0,R1,R2;将R1的值减去R2的值,结果保存到R0,MOV R1,R2,0 xAA,寻址方式分类寄存器寻址,立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBSR0,R0,#1;R0减1,结果放入R0,并且影响标志位MOVR0,#0 xFF000;将立即数0 xFF000装入R0寄存器,寻址方式分类立即寻址,MOV R0,#0 xFF00,0 xFF00,从代码中获得数据,寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,;即是R0=R28 ANDSR1,R1,R2,LSL R3;R2的值左移R3位,然后和R1相;“与”操作,结果放入R1,寻址方式分类寄存器移位寻址,MOV R0,R2,LSL#3,0 x08,0 x08,逻辑左移3位,寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDRR1,R2;将R2指向的存储单元的数据读出;保存在R1中 SWPR1,R1,R2;将寄存器R1的值和R2指定的存储;单元的内容交换,寻址方式分类寄存器间接寻址,LDR R0,R2,0 xAA,基址寻址就是将基址寄存器的内容与指令中给出的偏移量(4K)相加/减,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。寄存器间接寻址是偏移量为0的基址加偏移寻址。基址寻址指令举例如下(前索引寻址):LDRR2,R3,#0 x0C;读取R3+0 x0C地址上的存储单元;的内容,放入R2 STRR1,R0,#-4!;先R0=R0-4,然后把R0的值寄存;到保存到R1指定的存储单元,寻址方式分类基址寻址,LDR R2,R3,#0 x0C,0 xAA,将R3+0 x0C作为地址装载数据,基址寻址指令举例如下:LDRR0,R1,#4;R0=R1,R1R14;后索引基址寻址;ARM这种自动索引机制不消耗额外的时间LDR R0,R1,R2;R0=R1+R2,寻址方式分类基址寻址,多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIA R1!,R2-R7,R12;将R1指向的单元中的数据读出到;R2R7、R12中(R1自动加4)STMIA R0!,R2-R7,R12;将寄存器R2R7、R12的值保;存到R0指向的存储;单元中;(R0自动加4),寻址方式分类多寄存器寻址,LDR R1!,R2-R4,R6,0 x40000000,堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈,寻址方式分类堆栈寻址,寻址方式分类堆栈寻址,0 x12345678,0 x12345678,堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。,寻址方式分类堆栈寻址,0 x12345678,所以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。,寻址方式分类堆栈寻址,多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。如:STMIA R0!,R1-R7;将R1R7的数据保存到存储器中。;存储指针R0在保存第一个值之后增加,;增长方向为向上增长。STMIB R0!,R1-R7;将R1R7的数据保存到存储器中。;存储指针R0在保存第一个值之前增加,;增长方向为向上增长。,寻址方式分类块拷贝寻址,相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:BLSUBR1;调用到SUBR1子程序BEQLOOP;条件跳转到LOOP标号处.LOOP:MOVR6,#1.SUBR1:.,寻址方式分类相对寻址,3.3.3 指令集,指令分类(1)存储器访问指令 把存储器的值拷贝到寄存器中(load)or 把寄存器中的值拷贝到存储器中(store)(2)数据处理指令 使用和改变寄存器的值(3)控制流指令 分支分支和链接,保存返回的地址,以恢复最先的次序(4)软件中断指令(5)程序状态寄存器指令(6)协处理器指令(7)伪指令,(1)存储器访问指令,1)单寄存器数据传送(LDR、STR)2)多寄存器数据传送(LDM、STM)3)寄存器和存储器交换指令SWP,单字(32bit),半字(6 bit)以及字节(8 bit)传送寻址寄存器偏移地址=基址 寄存器偏移立即数偏移地址=基址 立即数常数后变址Post-indexing:modify address after use前变址Pre-indexing:modify address before use回写如果可能,更新基址寄存器,1)单指令传送(LDR,STR),单寄存器传送指令,寻址方式,例子,PRE r0=0 x00000000,r1=0 x00009000,Mem320 x00009000=0 x01010101 Mem320 x00009004=0 x02020202回写型前变址寻址:LDR r0,r1,#0 x4!POST r0=0 x02020202,r1=0 x00009004前变址寻址:LDR r0,r1,#0 x4 POST r0=0 x02020202,r1=0 x00009000后变址寻址:LDR r0,r1,#0 x4POST r0=0 x01010101,r1=0 x00009004,数据传送指令-5,2)多寄存器数据传送指令 LDM,STM,load(LDM)或 store(STM)当前可访问寄存器的任意子集 使用堆栈:maintaining full or empty stacks which can grow up or down memory上下文切换:保存或重新存储工作寄存器块拷贝:在主存储器中移动大数据块寻址Pre/Post indexingAuto increment or decrement回写到基址寄存器Write back the base register,多寄存器数据传送指令的要点,多寄存器Load/Store指令会增加中断的延迟,因为ARM不会打断正在执行的指令去响应中断,而必须等到指令执行完成;一般编译器将提供一个选项以控制Load/Store指令可以传送的最大寄存器数目,以限制最大中断延迟。,多寄存器传送指令的寻址模式,注:!决定Rn的值是否随着传送而改变,例子,要求:保存r1r3到内存地址0 x90000 x900c,并且更新基址寄存器r4PRE:r1=0 x00000001,r2=0 x00000002,r3=0 x00000003,r4=0 x9000执行操作:STMIA r4!,r1,r2,r3(执行后增加)POST:mem320 x9000=0 x00000001mem320 x9004=0 x00000002mem320 x9008=0 x00000003r4=0 x900c,多寄存器传送寻址模式,例:将存储器中的连续数据装载到寄存器,PRE:mem320 x80018=0 x03,mem320 x80014=0 x02,mem320 x80010=0 x01,r0=0 x00080010,r1=0 x00000000,r2=0 x00000000,r3=0 x00000000执行指令:LDMIA r0!,r1-r3POST:r0=0 x0008001c,r1=0 x00000001,r2=0 x00000002,r3=0 x00000003,例:完成一个存储器数据块拷贝,注:r9存放源数据的起始地址 r10存放目标起始地址 r11存放源结束地址 loop:LDMIA r9!,r0-r7;装载32字节并更新r9指针 STMIA r10!,r0-r7;存储32字节并更新r10指针 CMP r9,r11;是否到达结束地址 BNE loop;不相等跳转,堆栈操作,ARM使用多寄存器Load/Store指令来完成堆栈操作;使用堆栈时,需要确定堆栈在存储空间中是向上生长(递增的“A”)还是向下生长(递减的“D”);满堆栈(“F”)是指堆栈指针指向堆栈的最后一个已使用的地址或满位置;相反,空堆栈(“E”)是指SP指向堆栈的第一个没有使用的地址或空位置;,堆栈操作寻址方式,堆栈,ARM堆栈操作通过块传送指令来完成:STMFD(Push)块存储-Full Descending stack STMDBLDMFD(Pop)块装载-Full Descending stack LDMIA,STMFD sp!,r4-r7,lr,8034,例:把寄存器内容放入堆栈,更新sp,PRE:r1=0 x00000002,r4=0 x00000003,sp=0 x00080014执行指令:STMFD sp!,r1,r4POST:r1=0 x00000002,r4=0 x00000003,sp=0 x0008000c,在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。语法:SWPB Rd,Rm,Rn,3)单数据交换指令-SWAP,SWAP指令的用法,PRE mem320 x9000=0 x12345678,r0=0 x00000000,r1=0 x11112222,r2=0 x00009000执行操作:SWP r0,r1,r2POST:mem320 x9000=0 x11112222,r0=0 x12345678,r1=0 x11112222,r2=0 x00009000交换指令多用于实现操作系统中的信号量和互斥操作,该指令有修饰符B,即有字交换和字节交换两种形式;,(2)数据处理指令,1)数据传送指令-MOV,MOV指令是把一个数N送到目标寄存器中,N可以是寄存器,也可以是立即数。MOV指令语法:指令cond S Rd,N,PRE:r0=8,r2=5MOV r0,r2,LSL#2(逻辑左移两位:r22=5*4)POST:r0=20,r2=5,例:PRE:r0=5,r2=6 MOV r0,r2 POST:r0=6,r2=6,2)数据处理指令,立即数操作:移位寄存器操作数第二个操作数在与第一个操作数合成之前,是服从于移位操作的.,任何数据处理指令都可以设置条件码(N,Z,V,and C)适用于除比较操作外的所有数据处理指令特殊的请求必须在汇编语言中实现,这种请求是通过把”S”增加到选择代码中指定的算术操作设置所有的标志位(N,Z,C,and V)逻辑和移位操作设置 N and Z,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)。指令格式如下:Bcond Label 应用示例:B WAITA;跳转到WAITA标号处 B0 x1234;跳转到绝对地址0 x1234处,2)带链接的分支指令BL,带链接的分支指令BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR)连接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当前指令的32M字节地址内。指令格式如下:BLcond Label,1.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC),程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行,应用示例(调用子程序):BL Label,3)带状态切换的分支指令,带状态切换的分支指令BX指令,该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。指令格式如下:BXcond Rm,ARM指令分支指令,带状态切换的分支指令BX指令,该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。Rm的位0不用作地址的一部分。若Rm的位0为1,则指令将CPSR中的标志T置位,且将目标地址的代码解释为Thumb代码;若Rm的位0为0,则Rm的位1就不能为1。指令格式如下:BXcond Rm,应用示例:ADRL R0,ThumbFun+1;将Thumb程序的入口地址加1存入R0 BX R0;跳转到R0指定的地址,;并根据R0的最低位来切换处理器状态,分支和链接指令,分支子程序(r14 serves as a link register)嵌套子程序,Full Descending,(4)软件中断(SWI),产生一个异常陷阱,跳转到SWI 硬件向量。SWI 处理程序可以检测SWI号,从而决定采取何种操作。通过SWI机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。语法:SWI,软件中断(SWI)执行的操作,SWI中断处理程序,处理软件中断的代码段称为中断处理程序(SWI Handler),中断处理程序是通过执行指令的地址获取软件中断号,指令地址是从lr计算出来的;SWI号的确定方法:SWI_Number=and NOT(0 xff000000),0,SWI处理程序应用示例,SWI_handler;保存寄存器r0r12和lr STMFD sp!,r0-r12,lr;read the SWI instruction LDR r10,lr,#-4;make off top 8 bits BIC r10,r10,#0 xff000000;r10-contains the SWI number BL service_routine;return from SWI handler LDMFD sp!,r0-r12,pc,在SWI异常中断处理程序中,取出SWI指令中立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;然后取得该SWI指令的地址,这可通过访问LR寄存器得到;接着读出该SWI指令,分解出立即数。,SWI_Handler STMFD SP!,R0-R3,R12,LR;现场保护 MRS R0,SPSR;读取SPSR STMFD SP!,R0;保存SPSR TST R0,#0 x20;测试T标志位 LDRNEH R0,LR,#-2;若是Thumb指令,读取指令码(16位)BICNE R0,R0,#0 xFF00;取得Thumb指令的8位立即数(低8位)LDREQ R0,LR,#-4;若是ARM指令,读取指令码(32位)BICEQ R0,R0,#0 xFF000000;取得ARM指令的24位立即数(低23位).LDMFD SP!,R0-R3,R12,PC;SWI异常中断返回,NE:Z=0 EQ:Z=1,(5)程序状态寄存器访问指令,程序状态寄存器访问指令(MRS,MSR)MRS 程序状态寄存器到通用寄存器的数据传送指令MSR 通用寄存器到程序状态寄存器的数据传送指令,PSR 传送指令,MRS和MSR允许传送CPSR/SPSR中的内容到/从一个通用寄存器中。语法:MRS Rd,;Rd=MSR,Rm;=Rm在这里:=CPSR or SPSR_fields=fsxc的任意组合也允许送一个立即数到 psr_fields MSR,#Immediate用户模式下,所有位均可以被读取,但只有条件标志位(_)可被写。,状态寄存器访问指令示例,在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。,(6)协处理器指令-1,协处理器一般原理是通过增加核扩展指令集Example:如 MMU&cache.FPU等系统控制器寄存器协处理器专用ARM 控制数据流协处理器只包含数据处理和存贮器传送操作协处理器数据操作(CDP)这类指令是用来告诉协处理器执行某些内部操作无结果返回ARM,ARM并不等待操作完成,(6)协处理器指令-2,ARM体系支持16个协处理器针对每个协处理器的指令占用 ARM指令集中的固定部分 如果相应的协处理器不存在,将发生一个未定义指令异常。这有三种协处理器指令协处理器数据处理指令 CDP:初始化协处理器数据处理操作协处理器寄存器传送指令 MCR:从 ARM 寄存器移到协处理器寄存器 MRC:从协处理器寄存器移到ARM 寄存器协处理器存储器传送指令 LDC:从存储器装载到协处理器寄存器 STC:从协处理器寄存器存储到存储器,(7)ARM伪指令,ARM伪指令不属于ARM指令集中的指令,但是可以像其它ARM指令一样使用;伪指令为了编程方便而定义的。在编译时这些指令将被等效的一条或多条ARM指令所代替。ARM伪指令有四条,分别:ADR伪指令ADRL伪指令LDR伪指令NOP伪指令。,地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-255255;当地址值是字对齐时,其取指范围为-10201020;,1)ARM伪指令小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。编译源程序时,通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,1)ARM伪指令小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。编译源程序时,通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,应用示例(源程序):,使用伪指令将程序标号Delay的地址存入R0,.ADR R0,Delay.Delay MOV R0,r14.,.0 x20 ADD r0,pc,#0 x3c.0 x64 MOV r0,r14.,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。编译源程序时,通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,.ADR R0,Delay.Delay MOV R0,r14.,应用示例(源程序):,编译后的反汇编代码:,使用伪指令将程序标号Delay的地址存入R0,地址,程序代码,1)ARM伪指令小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。编译源程序时,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,.ADR R0,Delay.Delay MOV R0,r14.,应用示例(源程序):,.0 x20 ADD r0,pc,#0 x3c.0 x64 MOV r0,r14.,编译后的反汇编代码:,使用伪指令将程序标号Delay的地址存入R0,ADR伪指令被汇编成一条指令,1)ARM伪指令小范围的地址读取-3,应用示例2(查表):ADR R0,DISP_TAB;加载转换表地址 LDRB R1,R0,R2;使用R2作为参数,进行查表 DISP_TAB:DCB 0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,2)ARM伪指令中等范围的地址读取,ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-64K64K;当地址值是字对齐时,其取指范围为-256K256K;,.ADRL R0,Delay.Delay MOV R0,r14.,应用示例(源程序):,使用伪指令将程序标号Delay的地址存入R0,ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,2)ARM伪指令中等范围的地址读取,.ADRL R0,Delay.Delay MOV R0,r14.,应用示例(源程序):,.0 x20 ADD r0,pc,#400 x24 ADD r0,r0,#FF00.0 xFF68 MOV r0,r14.,编译后的反汇编代码:,使用伪指令将程序标号Delay的地址存入R0,地址,程序代码,ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,2)ARM伪指令中等范围的地址读取,.ADRL R0,Delay.Delay MOV R0,r14.,应用示例(源程序):,.0 x20 ADD r0,pc,#400 x24 ADD r0,r0,#FF00.0 xFF68 MOV r0,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的参数有“=”号。,应用示例(加载常量):,LDR R2,=0 xFF0;MOV R2,#0 xFF0LDR R0,=0 xFF000000;MOV R0,#0 xFF000000LDR R1,=0 xFFFFFFFE;MVN R1,#0 x1,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。,3)ARM伪指令大范围的地址读取,应用示例(加载地址):,.LDR R1,=InitStack.InitStack MOV R0,LR.,使用伪指令将程序标号InitStack的地址存入R1,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。,3)ARM伪指令大范围的地址读取,应用示例(加载地址):,编译后的反汇编代码:,.LDR R1,=InitStack.InitStack MOV R0,LR.,.0 x60 LDR R1,0 xb4.0 x64 MOV R0,LR.0 xb4 DCD 0 x64,使用伪指令将程序标号InitStack的地址存入R1,地址,程序代码,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。,3)ARM伪指令大范围的地址读取,应用示例(加载地址):,编译后的反汇编代码:,.LDR R1,=InitStack.InitStack MOV R0,LR.,.0 x60 LDR R1,0 xb4.0 x64 MOV R0,LR.0 xb4 DCD 0 x64,使用伪指令将程序标号InitStack的地址存入R1,LDR伪指令被汇编成一条LDR指令,并在文字池中定义了一个常量,该常量为InitStack标号的地址,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。,3)ARM伪指令大范围的地址读取,4)ARM伪指令空操作伪指令,NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOV R0,R0”指令等。NOP可用于延时操作。,NOP,NOP伪指令格式,应用示例(延时子程序):,mov R1,#0 x1234Delay NOP;空操作 NOP NOP SUBS R1,R1,#1;循环次数减一 BNE Delay;如果循环没有结束,跳转Delay继续 MOV PC,LR;子程序返回,0,15,31,0,ADDS r2,r2,#1,ADD r2,#1,32-bit ARM 指令,16-bit Thumb 指令,对于由编译器产生的大部分指令:没有条件执行源、目的寄存器必须相同仅能使用低寄存器常数大小有限制不能使用在线移位器,关于Thumb指令集,Thumb 是16-bit 指令集代码密度优化(总代码大小约为ARM指令的65%)使用窄总线存储器时可以大大提高性能。是 ARM 指令集的一个子集。核存在一个执行状态 Thumb状态ARM和Thumb之间切换使用BX 指令,写 Thumb汇编程序,Thumb不是一个“好”指令集!最好用编译器来产生约束并不一致手动编码使用ARM指令集比较好 更多细节,参看:ARM“Architecture Reference Manual”,

    注意事项

    本文(ARM微处理器的指令系统教学PPT.ppt)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开