收藏 分享(赏)

第3章 ARM9指令集和汇编(初稿).ppt

上传人:精品资料 文档编号:10699237 上传时间:2019-12-29 格式:PPT 页数:86 大小:274.16KB
下载 相关 举报
第3章 ARM9指令集和汇编(初稿).ppt_第1页
第1页 / 共86页
第3章 ARM9指令集和汇编(初稿).ppt_第2页
第2页 / 共86页
第3章 ARM9指令集和汇编(初稿).ppt_第3页
第3页 / 共86页
第3章 ARM9指令集和汇编(初稿).ppt_第4页
第4页 / 共86页
第3章 ARM9指令集和汇编(初稿).ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

1、,提纲,1、ARM指令集概述2、ARM指令的寻址方式3、ARM指令简介4、Thumb指令简介,1、ARM指令集概述,RISC简介ARM状态和Thumb状态ARM9指令类型和指令的条件域,RISC简介,RISC是计算机中央处理器的一种设计模式 全称Reduced Instruction Set Computer,中文称为精简指令集计算机 RISC选取使用最为频繁的简单指令及部分复杂指令,而且指令等长,通常指令为16位或32位,ARM状态和Thumb状态(1),从v4版本开始,ARM引入了Thumb指令集 Thumb指令为16位,能完成的功能是32位ARM指令的子集 ARM处理器支持两种运行状态

2、ARM状态 Thumb状态 ARM指令必须在ARM状态下执行 Thumb指令也必须处于Thumb状态下执行,必须使用ARM指令的情况 ARM处理器启动的第一句指令必须是ARM指令 访问程序状态寄存器CPSR或协处理器时必须是ARM指令 ARM在处理异常中断时会自动切换到ARM状态,执行中断处理程序入口处的程序。返回时,会再次自动切换到ARM状态ARM指令,ARM状态和Thumb状态(2),v4版本中的函数调用,如果不需要进行状态切换,只需要用到BL指令就可以实现了 如果需要进行状态切换,情况较复杂,如图3-1所示,ARM状态和Thumb状态(3),ARM状态和Thumb状态(4),不同状态间的

3、函数调用,ARM v5版本后,引入了一条新的指令BLX,结合了BL和BX指令各自的功能特点,使得上图的所示过程通过一条指令就能实现,ARM状态和Thumb状态(5),ARM9指令类型和指令的条件域(1),ARM指令集属于加载/存储型指令 指令的操作数都储存在寄存器中,处理结果直接放回到目的寄存器中 ARM9指令集可以分为6类 跳转指令 数据处理指令 存储器访问指令 协处理器指令 杂项指令 饱和算术指令,跳转指令,ARM9指令类型和指令的条件域(2),数据处理指令,ARM9指令类型和指令的条件域(3),存储器访问指令,ARM9指令类型和指令的条件域(4),协处理器指令,ARM9指令类型和指令的条

4、件域(5),杂项指令,ARM9指令类型和指令的条件域(6),饱和算术指令,ARM9指令类型和指令的条件域(7),ARM指令一般由操作码、目的寄存器、操作数几部分组成,并可以配合条件码,S后缀等可选项目,以完成更复杂操作,它的格式一般为:指令中内的项目是必需的,比如opcode, Rd, Rn等,内的项目是可选的,ARM9指令类型和指令的条件域(8),ARM9指令类型和指令的条件域(9),表3-1 ARM指令格式,ARM指令集几乎每条指令(除了某些v5T指令)都可以是条件执行的。指令的最高4位31:28称为条件码:,ARM9指令类型和指令的条件域,形式非常灵活,共有11种形式:,ARM9指令类型

5、和指令的条件域,ARM指令集有5种形式的位移操作 LSL逻辑左移 LSR逻辑右移 ASR算术右移 ROR循环右移 RRX带扩展的循环右移,ARM9指令类型和指令的条件域,逻辑左移(Logical Shift Left):操作时在移位操作时,用0补足低位;而逻辑右移(Logical Shift Right)移动的方向相反,并用0补足高位。 算术右移(Arithmetic Shift Right):在移位操作时,根据符号位来补足高位,若原数符号位是1,即当原数为负数时,移位空出的高位都用1补足,反之则用0补足。 循环右移(ROtate Right):可以将数字看做首位相接的“环形”,当最低位被移出

6、后,它会绕到数组的最高位去,继续参与移位操作。 带扩展的循环右移(Rotate Right one bit with eXtended):较前面的几种移位方法复杂一些,它需要用到CPSR中的C位。当最低位被向右移出后,最高位有C位的值补足,然后被移出的最低位被放到C位中。,ARM9指令类型和指令的条件域,立即数#并不是任意数都是合法的,在立即数寻址中,分配给立即数的空间是12位,8位用于保存一个常数,4位用于保存循环右移基数,而循环右移每次需要移动偶数位,即右移的位数是基数*2。 假设常数为A,循环右移位数为N,则最后得到的立即数=A循环右移(N*2位)。 0x3FC立即数合法,A=0b111

7、11111,N=0d15 0x1FE不合法,ARM9指令类型和指令的条件域,3.2 ARM指令的寻址方式,立即寻址 寄存器寻址 寄存器偏移寻址 寄存器间接寻址 基址变址寻址 多寄存器寻址 堆栈寻址 相对寻址,立即寻址 立即寻址也可被称为立即数寻址,读取指令后可以立即得到操作数,而不需要去物理内存得到相应内容。这个给出的操作数叫立即数,它一般以“#”为前缀,“#0x”、“#0d”,“#0b”开头的计数用来表示十六进制,十进制和二进制。,ARM指令的寻址方式,寄存器寻址 寄存器寻址也是一种不需要访问存储器内容的寻址方式,指令中直接指明操作数所在的寄存器,执行时处理器直接访问寄存器获取操作数,ARM

8、指令的寻址方式,寄存器偏移寻址 寄存器偏移寻址是ARM指令特有的一种寻址方式,第2操作数可以在与第1操作数结合之前,进行各种形式的移位操作,ARM指令的寻址方式,寄存器间接寻址 寄存器间接寻址的指令中虽然也是指定寄存器,但并不是直接拿寄存器中的值来进行运算操作,此时寄存器中储存的是地址,处理器需要根据这个地址从存储器中获取操作数。所以寄存器间接寻址是需要进行存储器访问的,所以执行效率比寄存器寻址要慢。,ARM指令的寻址方式,基址变址寻址 基址变址寻址与寄存器间接寻址相似,但此时从寄存器取出的内容需要加上指令所给定的偏移量,这样才构成操作数的有效地址。变址寻址方式通常用于访问基地址附近的地址单元

9、,常用于查表,数组操作,功能部件寄存器访问等,ARM指令的寻址方式,多寄存器寻址 多寄存器寻址方式可以在同一条指令中完成多个寄存器数据的传送,最多可以传送16个通用寄存器,ARM指令的寻址方式,堆栈寻址 堆栈是一个后进先出的数据结构,堆栈寻址方式会有一个指针,始终指向存储单元的栈顶,这个指针需要用一个专门的寄存器来存放,这个寄存器一般是R13。,ARM指令的寻址方式,有四种栈堆形式: 堆栈指针总是指向最后压入堆栈的数据,称为满堆栈(Full Stack) 堆栈指针指向下一个空位置时,称为空堆栈(Empty Stack) 从低地址向高地址生长的堆栈叫递增堆栈(Ascending Stack) 从

10、高地址向低地址生长的堆栈叫递减堆栈(Descending Stack),ARM指令的寻址方式,ARM指令的寻址方式,ARM指令的寻址方式,相对寻址 相对寻址可以看作是寄存器变址寻址方式的一个特例,因为此时包含基地址的寄存器特指程序计数器PC,通过PC值与指令中的偏移量结合,生成有效的操作数地址。一般这种寻址方式用于指令跳转,跳转指令,ARM转跳指令主要用于: 向后跳转实现循环; 通过条件判断实现现在跳转; 子程序调用;切换处理器工作状态。,ARM实现程序跳转有两种方法 将当前的程序寄存器PC值改写为跳转的目的地址,此时可以实现4G地址范围内的长跳转。使用专门的跳转指令实现,包括B、BL、BX和

11、BLX指令等,跳转指令,通用数据处理指令,ARM的通用数据处理指令大致可以分为4类 数据传送指令 算术逻辑运算指令 比较指令 前导零计数指令,数据传送指令 MOV(MOVE)和MVN(MOVE NOT) 格式为MOV指令将Operand2的值复制到Rd寄存器中,而MVN指令会先将Operand2按位取反后再复制到Rd寄存器中。 举例,通用数据处理指令,算术逻辑运算指令 ADD和ADC,SUB和SBC,RSB和RSC 这三组指令分别是加法指令,减法指令,逆向减法指令及其各自的带进位操作指令 格式为举例,通用数据处理指令,算术逻辑运算指令 AND,ORR,EOR,BIC 这四条指令分别是逻辑与指令

12、,逻辑或指令,逻辑异或指令和位清除指令 格式为举例,通用数据处理指令,比较指令 TST和TEQ 位测试指令和相等测试指令 格式为举例,通用数据处理指令,比较指令 CMP和CMN 比较指令和反值比较指令 格式为举例,通用数据处理指令,前导零计数指令 CLZ 前导零计数指令,它是从v5版本开始引入的 格式为该指令从Rm寄存器值的高位开始计数(32位的数据即从31开始),直到遇到第一个非零位为止,统计总共前导零的个数,并将统计值存入Rd中。,3.3.2 通用数据处理指令,乘法指令,MUL和MLA MUL和MLA指令是32的乘法指令和乘加指令 格式为举例,UMULL,UMLAL,SMULL和SMLAL

13、 上述指令的U表示无符号,S表示带符号,L表示结果为长整型。所以上述指令分别叫做无符号长整型乘法指令,无符号长整型乘加指令,带符号长整型乘法指令和带符号长整型乘加指令 格式为举例,乘法指令,SMULxy和SMLAxy SMULxy指令和SMLAxy指令是16位的带符号乘法指令 格式为举例,乘法指令,SMULWy和SMLAWy 分别是32*16位的带符号乘法指令和乘加指令 格式为举例,乘法指令,Load/Store内存访问指令,LDR和STR LDR和STR指令是单一数据加载和存储指令,LDR指令从内存读取数据装入寄存器中,STR指令将寄存器中的数据存入内存。 格式为举例,LDM和STM 批量加

14、载指令LDM将一片连续内存单元的数据加载到一组通用寄存器中,而批量存储指令STM将一组通用寄存器中的值存储到一片连续内存单元之中 格式为举例,Load/Store内存访问指令,SWP(Swap) 交换指令SWP用于寄存器和存储器之间内容的交换,它将指定内存单元的数据存入目标寄存器,然后将源寄存器的内容储存到该内存单元中 格式为举例,Load/Store内存访问指令,PLD 预读取PLD指令是ARMv5E版本引入的,它指示存储器系统在接下去的几条指令中很可能会有Load指令,存储系统以此做好相应的准备,从而加速内存访问过程 格式为举例,Load/Store内存访问指令,ARM协处理器指令,CDP

15、和CDP2 CDP是协处理器数据处理指令(Coprocessor Data oPeration),用来执行特定的数据操作;CDP2是从ARMv5版本引进的 格式为举例,LDC和LDC2,STC和STC2 LDC指令将存储器内容复制到协处理器寄存器中,而STC指令则是将协处理器寄存器数据拷贝到存储器中。 格式为举例,ARM协处理器指令,MCR, MCR2和MCRR MCR指令将ARM寄存器中的数据传输到协处理器寄存器中。MCR指令将ARM寄存器中的数据传输到协处理器寄存器中 格式为 举例,ARM协处理器指令,MRC,MRC2和MRRC MRC指令的数据传输方向与MCR指令相反,它将协处理器寄存器

16、中的数据传送到ARM处理器寄存器中。MRC2指令是从ARMv5版本引入的,而MRRC指令从ARMv5E版本引入 格式为举例,ARM协处理器指令,杂项指令,SWI 软件中断指令SWI用来实现在用户模式下的程序调用管理模式下的代码,这条指令造成处理器模式的切换,CPSR会被存入管理模式下的SPSR,随后指令会跳转到中断向量。 格式为举例,MRS和MSR 状态寄存器读取指令MRS(Move to ARM Register from Status register)和写状态寄存器指令MSR(Move to a Status register from ARM Register),用于在程序状态寄存器和

17、ARM通用寄存器之间传输数据 格式为举例,杂项指令,BKPT ARMv5版本引入的断点指令,使用断点指令使ARM处理器进入Debug模式 格式为举例,杂项指令,饱和算术指令,QADD,QSUB,QDADD和QDSUB 饱和算术指令(saturating arithmetic instructions)在发生溢出时,Q位会被置位,若结果小于231,返回的结果为231,若结果大于231 -1,则返回的结果为231 -1。因此如果在计算结束后目标寄存器保存了饱和数(231或231 -1)且Q置位,则说明程序发生了溢出。 格式为举例,ARM伪指令,ADR 小范围的地址读取伪指令,主要用来读取基于PC相

18、对偏移的地址或基于寄存器相对偏移的地址。 格式为举例,ADRL 中等范围地址取指伪指令,它的取值范围比ADR要大,通常会用两条指令来替代 格式为举例,ARM伪指令,LDR 这里讲的是LDR伪指令,不是内存访问指令LDR。LDR伪指令是大范围地址读取伪指令,用于加载32位的立即数或是一个地址值 格式为举例,ARM伪指令,4、Thumb指令简介,Thumb指令将32位ARM指令的一个子集进行编码,成为一个16位的指令集。相对于ARM指令集,Thumb指令拥有更高的代码密度,这对于嵌入式设备来说至关重要。Thumb指令继承了ARM指令许多特点,它也是采用Load/Store结构,有数据处理、数据传送

19、机流控制指令等。除了B指令外,Thumb指令都是无条件执行的,许多Thumb指令数据处理指令都是采用2地址格式,即目的寄存器和源寄存器相同,而大多数ARM数据处理指令采用3地址格式,B B指令是Thumb指令中唯一可以条件执行的指令。 格式为举例,Thumb跳转指令,BL 带链接的长跳转 格式为举例,Thumb跳转指令,BX BX指令在跳转的同时,会选择性的切换指令集 格式举例,Thumb跳转指令,BLX BLX是带链接的跳转,并选择性的切换指令集。指令格式如下: 格式举例,Thumb跳转指令,Thumb通用数据处理指令,AND,ORR,EOR和BIC 这四条指令是按位逻辑运算指令,分别是按位

20、与,按位或,按位异或和按位清零操作 格式举例,Thumb通用数据处理指令,ASR,LSL, LSR和ROR 这四条指令是移位指令,分这四条指令是按位逻辑运算指令,分别是按位与,按位或,按位异或和按位清零操作 格式举例,CMP和CMN 比较指令和反值比较指令 格式举例,Thumb通用数据处理指令,MOV,MVN和NEG 格式:举例,Thumb通用数据处理指令,TST 位测试指令 格式举例,Thumb通用数据处理指令,Thumb算术指令,低寄存器 的ADD和SUB 低寄存器是指指令中使用的寄存器范围是R0-R7 格式举例,高寄存器或低寄存器的ADD 格式举例,Thumb算术指令,sp的ADD和SU

21、B 这两条指令将堆栈指针sp作为操作数,用来增加或减少sp 格式举例,Thumb算术指令,Thumb算术指令,pc或sp相关的ADD 这条指令将sp或pc的值加上或减去一个常量,并将结果存入低寄存器中 格式举例,ADC,SBC和MUL 这三条指令分别是带进位的加法指令,带进位的减法指令,以及乘法指令。 格式举例,Thumb算术指令,立即数偏移的LDR和STR 内存地址由寄存器基址和立即数偏移指定 格式举例,Thumb内存访问指令,寄存器偏移的LDR和STR 内存地址由寄存器基址和寄存器偏移指定 格式举例,Thumb内存访问指令,pc或sp相关的LDR和STR 内存地址由pc值或sp值加上一个偏

22、移量指定 格式举例,Thumb内存访问指令,PUSH和POP PUSH指令将低寄存器(有时包括lr)的内容压入堆栈中;POP指令将低寄存器(有时包括pc)的内容从堆栈中弹出 格式举例,Thumb内存访问指令,LDMIA和STMIA 这两条指令用来读取或存入多个寄存器内容 格式举例,Thumb内存访问指令,Thumb软中断和断电指令,SWI 软中断指令 格式举例,BKPT 断点指令 格式举例,Thumb软中断和断电指令,Thumb伪指令,ADR Thumb伪指令 ADR伪指令读取一个程序相对的地址到寄存器 格式举例,DR Thumb伪指令 LDR伪指令读取地址或32位的常量到低寄存器中 格式举例,Thumb伪指令,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报