arm9寻址方式及指令集介绍

上传人:j7****6 文档编号:61622116 上传时间:2018-12-07 格式:PPT 页数:117 大小:1.45MB
返回 下载 相关 举报
arm9寻址方式及指令集介绍_第1页
第1页 / 共117页
arm9寻址方式及指令集介绍_第2页
第2页 / 共117页
arm9寻址方式及指令集介绍_第3页
第3页 / 共117页
arm9寻址方式及指令集介绍_第4页
第4页 / 共117页
arm9寻址方式及指令集介绍_第5页
第5页 / 共117页
点击查看更多>>
资源描述

《arm9寻址方式及指令集介绍》由会员分享,可在线阅读,更多相关《arm9寻址方式及指令集介绍(117页珍藏版)》请在金锄头文库上搜索。

1、第3章 ARM指令系统,硅谷芯微 技术贡献 网址:www.threeway.cc,面对复杂多变的ARM汇编指令表,本章重点介绍实用价值大、有一定难度且理解起来容易出错的指令,以点带面达到全面掌握ARM汇编指令的目的。,第3章 目录,1. ARM处理器寻址方式 2. 指令集介绍 3. 课后练习,3.1 ARM处理器寻址方式,ARM处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单。ARM9TDMI(-S)具有32位ARM指令集和16位Thumb指令集,ARM指令集效率高,但是代码密度较低;而Thumb指令集具有较高的代码密度,并且保持ARM的大多数性能上的优势,它是

2、ARM指令集的子集。所有的ARM指令都是可以有条件执行的,而Thumb指令仅有一条指令(分支指令B)具备条件执行功能。ARM程序和Thumb程序可相互调用,相互之间的状态切换开销几乎为零。,说明:本章中的ARM9TDMI(-S)表示ARM9TDMI或ARM9TDMI-S。 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有8种基本寻址方式。,3.1.1 寄存器寻址,寄存器寻址是指操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。 应用示例:,3.1.2 立即寻址,立即寻址指令中的操作码字段后面的地址码部分即是操作数本

3、身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。 应用示例:,3.1.3 寄存器移位寻址(1),寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。 应用示例: 可采用的移位操作如下: LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0; LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0; ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,若

4、源操作数为正数,则字的高端空出的位补0,否则补1;,3.1.3 寄存器移位寻址(2), ROR:循环右移(ROtate Right),由字的低端移出的位填入字的高端空出的位; RRX:带扩展的循环右移(Rotate Right eXtended by 1 place),操作数右移1位,高端空出的位用原C标志值填充。 各种移位操作如图3.1所示。 图3.1 移位操作示意图,3.1.4 寄存器间接寻址,寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。 应用示例:,3.1.5 基址寻址,基址寻址就是将基址寄存器的内容

5、与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。 应用示例:,3.1.6 多寄存器寻址,多寄存器寻址是指一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。 应用示例:,3.1.7 堆栈寻址(1),在2.5.1小节的“堆栈指针(SP)”中介绍了堆栈的定义和作用,接下来讲述堆栈在ARM9中的特性。 前面讲过对堆栈操作都是通过堆栈指针(SP)来进行的,随着堆栈内容的增减,堆栈指针也做相应的移动。那么有个问题,当写入数据时堆栈指针是如何变化的呢? 堆栈指针的移动方向称之为“堆栈的生长方向”,ARM

6、9可以支持2种,如图3.2所示。 向上生长:在向堆栈写入数据后,堆栈指针的值变大,也就是向高地址方向生长,称之为递增堆栈; 向下生长:在向堆栈写入数据后,堆栈指针的值变小,也就是向低地址方向生长,称之为递减堆栈。,3.1.7 堆栈寻址(2),图3.2 堆栈的生长方向,3.1.7 堆栈寻址(3),除了要考虑堆栈指针的增长方向之外,还要考虑堆栈指针指向的存储单元是否已经保存有堆栈数据,或者说在入栈时是否可以直接向堆栈指针指向的存储单元写入数据。 ARM9支持2种情况,分别为“满堆栈”和“空堆栈”,如图3.3所示。 满堆栈:堆栈指针指向最后压入的有效数据项,称为满堆栈。这种堆栈的入栈操作要先调整指针

7、再写入数据。 空堆栈:堆栈指针指向下一个待压入数据的空位置,称为空堆栈。这种堆栈的入栈操作要先写入数据再调整指针。,3.1.7 堆栈寻址(4),图3.3 堆栈的满空特性,3.1.7 堆栈寻址(5),综合前面的堆栈生长方向和堆栈的满空特性,可以得到4种堆栈类型,分别为: 满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有有效数据项的最高地址。如指令LDMFA、STMFA等。 空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。如指令LDMEA、STMEA等。 满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有有效数据项的最低地址。如指令LDMFD、ST

8、MFD等。 空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。如指令LDMED、STMED等。,3.1.7 堆栈寻址(6),应用示例:,3.1.8 相对寻址,相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段做为偏移量,两者相加后得到的地址即为操作数的有效地址。 应用示例:,3.2 指令集介绍,本节介绍ARM9TDMI(-S)的指令集,包括ARM指令集和Thumb指令集。首先介绍ARM指令的基本格式及灵活的操作数,然后介绍条件码。重点介绍ARM指令集,对Thumb指令集,仅作简要介绍。 在介绍ARM指令集之前,先看一个简单的ARM汇编程序,

9、了解有关ARM指令汇编格式、程序结构和基本风格,完整代码如程序清单3.1所示。,程序清单3.1 寄存器相加, 第行为程序说明,使用分号“;”进行注释,分号“;”号后面至行结束均为注释内容。 第行声明一个代码段,ARM汇编程序至少要声明一个代码段。 第行标识程序入口,在仿真调试时会从指定入口处开始运行程序。 第行声明32位ARM指令,ARM9TDMI(-S)复位后是ARM状态。 第行为实际代码,标号要顶格书写(如START、LOOP、ADD_SUB),而指令不能顶格书写。BL为调用子程序指令,它会把返回地址(即下一条指令的地址)存到LR,然后跳转到子程序ADD_SUB。子程序ADD_SUB处理结

10、束后,将LR的值装入PC即可返回。, 第、行为空行,目的在于增强程序的可读性。 第行用于指示汇编文件结束,每一个ARM汇编文件均要用END声明结束。,3.2.1 ARM指令集,ARM指令集为32位字对齐指令集,效率高但代码密度较低。这是本章的重点。,3.2.1.1 指令格式(1),ARM指令的基本格式如下: S , S , , 其中,号内的项是必需的;号内的项是可选的。例如是指令助记符,这是必须书写的,而为指令执行条件,是可选项。若不书写则使用默认条件AL(无条件执行)。 opcode:指令助记符,如LDR、STR等。 cond:执行条件,如EQ、NE等,参考表3.1。 S:是否影响CPSR寄

11、存器的值,书写时影响CPSR。 Rd:目标寄存器。,3.2.1.1 指令格式(2), Rn:第1个操作数的寄存器。 operand2:第2个操作数。 指令格式应用举例: 在ARM指令中,灵活地使用第2个操作数能够提高代码效率。第2个操作数有如下几种形式: (1)immed_8r常数表达式。该常数必须对应8位位图(pattern),即常数是由一个8位的常数循环移位偶数位得到的。,3.2.1.1 指令格式(3), 合法常量:0x3FC(0xFF2)、0、0xF0000000(0xF024)、200(0xC8)、0xF0000001(0x1F28)。 非法常量:0x1FE、511、0xFFFF、0x

12、1010、0xF0000010。 常数表达式应用举例: (2)Rm寄存器方式。在寄存器方式下,操作数即为寄存器的数值。,3.2.1.1 指令格式(4),寄存器方式应用举例: (3)Rm,shift寄存器移位方式。将寄存器的移位结果作为操作数,但Rm值保持不变,移位方法如下: ASR # n:算术右移n位(1n32)。 LSL # n:逻辑左移n位(1n31)。 LSR # n:逻辑右移n位(1n32)。 RRX:带扩展的循环右移1位。 type Rs:type为ASR、LSL、LSR和ROR中的一种;Rs为偏移量寄存器,低8位有效。若Rs值大于或等于32,则第2个操作数的结果为0(ASR、RO

13、R例外)。,3.2.1.1 指令格式(5),寄存器移位方式应用举例: R15为处理器的程序计数器PC,一般不要对其进行操作,而且有些指令是不允许使用R15的,如UMULL指令。,3.2.1.2 条件码(1),使用指令条件码可实现高效的逻辑操作,提高代码执行效率。所有的指令条件码如表3.1所列。 表3.1 指令条件码列表 对于Thumb指令集,只有B指令具有条件码执行功能。此指令的条件码同表3.1。但如果为无条件执行时,条件码助记符AL不能在指令中书写。,3.2.1.2 条件码(2),应用示例: 比较两个值大小,并进行相应加1处理,C代码如下: 对应的ARM指令如下(其中R0为a,R1为b):

14、若两个条件均成立,则将这两个数值相加,C代码如下:,3.2.1.2 条件码(3),对应的ARM指令如下(其中R0为a,R1为b):,3.2.1.3 ARM存储器访问指令(1),ARM处理器是RISC架构的处理器,它无法像CISC架构的处理器一样让存储器中的内容直接参与运算,而是需要将存储单元的内容先读取到内部寄存器中。ARM处理器是加载/存储体系结构的典型RISC处理器,对存储器的访问只能使用加载和存储指令实现。ARM的加载/存储指令可实现字、半字、无符号字节和有符号字节的操作;多寄存器加载/存储指令可实现一条指令加载/存储多个寄存器的内容,大大提高了效率;SWP指令是一条寄存器和存储器内容交

15、换的指令,可用于信号量操作等。ARM处理器是冯诺依曼体系结构,程序空间、RAM空间及I/O映射空间统一编址,对这些空间的访问均须通过加载/存储指令进行。ARM存储器访问指令如表3.2所列。,3.2.1.3 ARM存储器访问指令(2),表3.2 ARM存储器访问指令,3.2.1.3 ARM存储器访问指令(3),(1)LDR/STR加载/存储指令: LDR指令用于从内存中读取数据放入寄存器中;STR指令则相反,它用于将寄存器中的数据保存到内存中。LDR和STR指令搭配不同的后缀可以实现字节、半字或字数据的访问。 加载/存储字和无符号字节指令: 指令格式: LDRcondT Rd, ;加载指定地址上的数据(字),放入Rd中 STRcondT Rd, ;存储数据(字)到指定地址的存储单元,要存储的数据在Rd中 LDRcondBT Rd, ;加载字节数据,放入Rd中,即Rd最低字节有效,高24位清零,3.2.1.3 ARM存储器访问指令(4),STRcondBT Rd, ;存储字节数据,要存储的数据在Rd,最低字节有效 其中,T为可选后缀,若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看成是处理器是在用户模式下,T在用户模式下无效,不能与前索引偏移一起使用T。 LDR/STR指令寻址是非常灵活的,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号