好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第4章 ARM指令集系统2.ppt

56页
  • 卖家[上传人]:飞***
  • 文档编号:6393094
  • 上传时间:2017-08-08
  • 文档格式:PPT
  • 文档大小:466KB
  • / 56 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 内容提要,4.1 数据处理指令4.2 ARM分支指令4.3 加载/存储指令4.4 批量加载/存储指令4.5 交换指令4.6 程序状态寄存器PSR访问指令4.7 协处理器操作指令4.8 异常产生指令,4.3 加载/存储指令,用于操作32位的字类型数据以及8位无符号的字节类型数据;用于操作16位半字类型数据和8位的有符号字节类型数据Load/Store指令用于寄存器和内存间数据的传送Load用于把内存中的数据装载到寄存器中Store用于把寄存器中的数据存入内存该集合的指令使用频繁,在指令集中最为重要,因为其他指令只能操作寄存器,当数据存放在内存中时,必须把数据从内存装载到寄存器,执行完以后再把寄存器中的内容存回到内存中4.3.1加载/存储字、无符号字节指令,1. LDR/STR指令LDR{cond} Rd,STR{cond} Rd,LDR{cond}T Rd,STR{cond}T Rd,T为用户模式下的操作,LDR字数据加载指令,格式:LDR{cond} Rd,功能:把addressing所表示的内存地址中的字数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。

      地址addressing可以使一个简单的值,一个偏移量,或者一个被移位的偏移量寻址方式: Rn:基址寄存器 Rm:变址寄存器 Index:偏移量,12位的无符号数 举例: LDR Rd,[Rn] ;把内存中地址为Rn的字数据装入寄存器Rd中 LDR Rd,[Rn,Rm];将内存中地址为Rn+Rm的字数据装入寄存器Rd中LDR Rd,[Rn,#index]LDR Rd,[Rn,Rm,LSL#5]LDR Rd,[Rn,Rm]!LDR Rd,[Rn,#index]!LDR Rd,[Rn,Rm,LSL#5]!LDR Rd,[Rn],Rm这些指令都是合法的,但是各条都是什么意思?,,STR字数据存储指令,格式: STR{cond} Rd,功能:把寄存器Rd中的字数据(32位)保存到addressing所表示的内存地址中,同时还可以把合成的有效地址回写到基址寄存器地址addressing可以使一个简单的值、一个偏移量,或者一个被移位的偏移量寻址方式同LDR指令例如: STR R0,[R1,#5]! ;把R0中的字数据保存到以R1+5为地址的内存中,然后R1=R1+5,例4-27,2. LDRB/STRB指令,LDR{cond}B Rd,STR{cond}B Rd,LDR{cond} BT Rd,STR{cond}BT Rd,T为用户模式下的字节数据操作,LDRB字节数据加载指令,格式LDR{cond}B Rd,功能:同LDR指令,但该指令是从内存中读取一个8位字节数据而不是一个32位的字数据,并将Rd的高24位清0。

      例如: LDRB R0,[R1];将内存中起始地址为R1的一个字节数据装入R0中,STRB字节数据存储指令,格式STR{cond}B Rd,功能:把寄存器Rd中的低8位字节数据保存到addressing所表示的内存地址中例如: STRB R0,[R1];将寄存器R0中的低8位数据存入R1表示的内存地址中,例4-28,4.3.2 半字、有符号字节访问指令,半字数据访问指令用于内存中的数据与寄存器低16位数据进行操作,有符号字节访问指令可实现向寄存器加载8位的有符号字节数据对于向寄存器加载无符号半字数据,寄存器的高16位bits[31:16]清零;对于向寄存器加载有符号半字数据,寄存器的高16位bits[31:16]用符号位扩展为32位;对于向寄存器加载有符号字节数据,寄存器的高24位bits[31:8]用符号位扩展为32位LDR{cond}H Rd,STR{cond}H Rd,LDR{cond}SH Rd, LDR{cond}SB Rd, 与LDR指令同,只不过H代表半字,高16位清零S代表有符号数,多余位用符号位扩展,例4-29,,需要注意的事项: LDR指令addressing可以不用字节或者半字对齐,因为寄存器在芯片内部,可以自行的进行移位操作调整。

      但是STR指令中addressing必须要求半字或者字节对齐4.4 批量加载/存储指令,ARM微处理器所支持批量数据加载/存储指令可以一次性实现一片连续的存储器单元和多个寄存器之间进行传送数据批量数据加载指令用于将一片连续的存储器中的数据传送到多个寄存器中,批量数据存储指令能够实现将多个寄存器中的内容一次性的存放到一片连续的存储器中4.4.1基本批量字数据加载/存储指令,批量加载:LDM {} {!}, 批量存储:STM {} {!}, ,注意事项,* Rn不允许为程序计数器PC(R15)* 指令中寄存器和连续内存地址单元的对应关系:编号低的寄存器对应内存低地址单元,编号高的寄存器对应内存高地址单元如果指令中基址寄存器在寄存器列表中,而且指令中寻址方式指定指令执行后更新基址寄存器 的值,则指令执行会产生不可预知的结果{!}:若选用了此后缀,则当指令执行完毕后,将最后的地址写入基址寄存器LDM批量数据加载指令,格式: LDM {} {!}, 功能:从一片连续的内存单元读取数据到各个寄存器中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表registers表示。

      addr_mode字段种类IA:每次传送后地址加1. IB:每次传送前地址加1DA:每次传送后地址减1. DB:每次传送前地址减1 FD:满递减堆栈 ED:空递减堆栈FA:满递增堆栈 EA:空递增堆栈,,例如:LDMIA/IB/DA/DB R13!,{R0-R1,R3};各指令执行完后结果如图所示R13传送完后是多少?,,FD,ED,FA和EA 指定是满栈还是空栈,是升序栈还是降序栈,用于堆栈寻址 一个满栈的栈指针指向上次写的最后一个数据单元空栈的栈指针指向第一个空闲单元一个降序栈是在内存中反向增长而升序栈在内存中正向生长,STM批量数据存储指令,格式: STM {} {!}, 功能:将个寄存器的值存入一片连续的内存单元中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表registers 表示该指令一般用于多个寄存器数据的入栈示例解析,MOV R1,#0x9000MOV R0,#0x11MOV R2,#0x22MOV R3,#0x33MOV R4,#0x44MOV R5,#0x55STMDB R1! ,{R0,R2-R5},存储情况如下,,,4.4.2 用户模式下的批量字数据 加载/存储指令,用户模式下的批量字数据加载/存储指令操作实现的操作是:即使处理器工作在特权模式下,存储系统也将访问看成是处理器在用户模式下,因此所加载/存储的寄存器组为用户模式下的寄存器。

      该指令寄存器列表中不包含程序计数器PC,不允许对基地址寄存器回写操作用户模式下的批量字数据加载/存储指令汇编语法格式为批量加载:LDM {} , ^批量存储:STM {} , ^,4.4.3带PSR操作的批量字数据加载指令,在带PSR操作的批量字数据加载指令中,程序计数器PC包含在指令寄存器列表中该指令将数据从连续的内存单元中读取到指令中寄存器列表中的各寄存器中它同时将目前处理器模式对应的SPSR寄存器内容复制到CPSR寄存器中批量加载:LDM {} {!}, ^批量存储:STM {} {!}, ^,,示例解析:,如何用带PSR操作的批量字数据加载指令实现IRQ中断的返回? 在进入IRQ中断处理程序时,首先计算返回地址,并保存相关的寄存器 SUB R14,R14,#4 ; STMFD R13!, {R0-R3, R12, LR} 如果IRQ中断处理程序返回到被中断的进程则执行下面的指令。

      该指令从数据栈中恢复寄存器R0~R3及R12的值,将返回地址传送到PC中,并将SPSR_irq值复制到CPSR中 LDMFD R13!, {R0-R3, R12, PC}^,4.5 交换指令,ARM指令支持原子操作,主要是用来对信号量的操作,因为信号量操作的要求是作原子操作,即在一条指令中完成信号量的读取和修改操作字数据交换指令,SWP是对字数据操作指令,用于将一个寄存器Rn为地址的内存字数据单元的内容读取到一个寄存器中,同时将另一个寄存器Rm的内容写入到该内存单元中SWP{} , , []例如:SWP R0,R1,[R2] ; 将R2所表示的内存单元中的字数据装载到R0,然后将R1中的字数据保存到R2所表示的内存单元中,,字节数据交换指令,SWPB是对字节操作指令,用于将一个寄存器Rn为内存地址的字节数据单元的内容读取到一个寄存器Rd中,寄存器Rd的高24设置为0,同时将另一个寄存器Rm的低8位数值写入到该内存单元中 SWP{}{B} , ,[]具体操作同SWP4.6程序状态寄存器PSR访问指令,程序状态寄存器PSR访问指令用来实现通用寄存器与程序状态寄存器之间的数据传输,共有两条:读程序状态寄存器指令MRS和写程序状态寄存器指令MSR。

      这类指令可以用来修改CPSR,通常是通过“读取-修改-写回”的操作序列来实现读程序状态寄存器指令,MRS指令用于将状态寄存器的内容传送到通用寄存器中这是程序获得程序状寄存器PSR数据的唯一方法 MRS {} , CPSR/SPSR用于当进入中断服务程序或者进程切换时,该指令用于保存当前状态寄存器的值例如:MRS R0,CPSR ;状态寄存器CPSR的值存入寄存器R0中,,写程序状态寄存器指令,MSR指令用于将通用寄存器的内容或一个立即数传送到程序状态寄存器中,实现对程序状态寄存器的修改 MSR {} CPSR_, < operand2> MSR {} SPSR_, < operand2>,,fields设置状态寄存器中需要操作的位域状态寄存器分为4个8位的域: bits[31:24]为条件标志位域,用f表示;bits[23:16]状态位域,用s表示; bits[15:8]扩展位域,用x表示;bits[7:0]控制位域,用c表示;第二操作数operand2的构成形式有以下两种形式: 为将要传送到状态寄存器中的立即数;寄存器包含将要传送到状态寄存器中的数据。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.