ARM体系结构与编程---第二章.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第2章 ARM指令分类及寻址方式 ARM指令的分类 跳转指令、数据处理指令、程序状态传输指令、Load/Store指令、协处理器和异常中断产生指令6类 2.1 ARM指令的一般格式 ??说明?? Cond?? 指令执行的条件编码?? Opcode?? 指令操作符编码?? S?? 决定指令的操作是否影响CPSR的值?? Rd?? 操作目标寄存器编码?? Rn?? 包含第一操作数的寄存器编码?? Shifter_operand?? 表示第二操作数 2.1 ARM指令的一般格式 一条指令代码的举例: ADDEQ R5,R7,R3,LSL #2 ;若条件满足Z=1,将R3左移2位与R7相加放入R5 这条指令的二进制编码是: 2.1 ARM指令的一般格式 ARM指令集——条件码 2.1 ARM指令的一般格式 ARM指令——条件码 2.1 ARM指令的一般格式 ARM指令——条件码 2.1 ARM指令的一般格式 ARM指令——条件码 2.1 ARM指令的一般格式 ARM指令——指令格式 2.2 ARM处理器寻址方式 寻址方式分类 2.2 ARM处理器寻址方式 寻址方式分类 合法的立即数(参见教材25页图) 〈immediate〉= immed_8 循环右移(2 X rotate_imm) 判断合法立即数的方法 0-0xff之间的一个8位数。 在满足不超8位的情况下,若最右侧的“1”的右侧0形成偶数位时,从最右侧的“1”算起,否则为奇数时在右侧多取一个0,向高位(向左),得到这个8位数。 类型 为0xf000 000f的 除外,(合法立即数)。 循环右移偶数位。 练习 下面哪些立即数是数据处理指令中有效的数据? a) 0x000003FC b) 0x000001FE c) 0xF0000000 d) 0x0000FFFF e) 0xF0000001 f) 0xF0000010 g) 0 24页书上 0x8000 0010 0x108 循环右移4位得到0x8000 0010 0001 0000 1000 取0x42循环右移30位可以得到0x108 0100 0010 那么,0x42循环右移34位可以得到0x8000 0010 也就是0x42循环右移两位就可得到0x8000 0010。 0x8000 0010 为合法立即数 0x2000 0010 0x102 循环右移4位得到0x2000 0010 0001 0000 0010 取0x81循环右移31位可以得到0x102,移位为奇数,则0x102非法。 那么0x2000 0010 为非法。 立即数(2) 装载32 bit常数 为允许装载较大的立即数,汇编器提供了一条伪指令:?? LDR Rd, =const?? 推荐使用这种方法把常数装入寄存器 如, LDR R1,=0XFFFFFF00 Rm——寄存器方式 可以采取的移位操作如下: LSL:逻辑左移(Logical Shift Left) LSR:逻辑右移(Logical Shift Right) ASR:算术右移(Arithmetic Shift Right) ROR:循环右移(ROtate Right) RRX:扩展为1的循环右移(Rotate Right eXtended by 1 place ) 2.2 ARM处理器寻址方式 寻址方式分类 2.2 ARM处理器寻址方式 寻址方式分类 2.2.2 字及无符号字节的Load/Store指令的寻址方式 Load指令用于从存储器(包括内存和外存)中读取数据加载到寄存器中; Store指令用于将寄存器的数据保存到存储器。 各种类型的Load/Store指令中寻找的地址由两部分组成: 1〉基址寄存器:一般使用通用寄存器 2〉地址偏移量:立即数、寄存器、寄存器及一个移位常数。 需要的地址=基址寄存器+地址偏移量 寄存器移位寻址 2.2.2 字及无符号字节的Load/Store指令的寻址方式 变址寻址 偏移量方法 LDR R0,[R1,R2,LSL #2];R0←[R1+R2*4],R1不变 事先更新基址(前索引)(前变址) 操作之前,先改变基址寄存器。 LDR R0,[R1,R2,LSL #2]! ;R0←[R1+R2*4] ,更新R1为R1+R2*4 事后更新基址(后索引)(后变址) 操作之后,再改变基址寄存器。 LDR R0,[R1] ,R2,LSL #2;R0←[R1],更新R1为R1+R2*4 Pre or Post Indexed store寻址 I=0,立即数偏移 I=1,寄存器偏移 P=1,偏移量

文档评论(0)

有一二三 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档