实验六ARM数据加载与存储指令实验.docVIP

实验六ARM数据加载与存储指令实验.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验六ARM数据加载与存储指令实验.doc

实验六 ARM数据加载与存储指令实验 一、实验目的 1、熟悉教学ADS集成开发环境, 2、懂得各种ARM寻址方式,并能自己动手写一些简单小程序。 3、能够运行程序并进行简单分析 二、实验环境 硬件:PC机一台。 软件:Windows98/XP/2000系统,ADS集成开发环境。 三、预备知识 LDR 和STR——用于字和无符号字节 指令格式: LDR/STR{cond}{T} Rd,地址 LDR/STR{cond}B{T} Rd,地址 指令LDR{cond}{T} Rd,地址,加载指定地址的字数据到Rd中;指令STR{cond}{T} Rd,地址,存储Rd中的字数据到指定的地址单元中。LDR{cond}B{T} Rd,地址指令 加载指定地址的字节数据到Rd的的最低字节中(Rd的高24位清零);STR{cond}B{T} Rd, 地址指令存储Rd中的最低字节数据到指定的地址单元中。T为可选后缀,若有T,那么即使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下,T 在用户模式下无效,不能与前索引偏移一起使用T。地址部分可用的形式有4种: 零偏移(zero offset) [Rn],Rn 的值作为传送数据的地址。如: LDR R0,[R1]; 前索引偏移(pre-indexed offset) [Rn,Flexoffset]{!} 在数据传送之前,将偏移量Flexoffset 加到Rn 中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn 中,35且Rn 不允许是R15,如: LDRB R0,[R1,#8] LDR R0,[R1,#8]! 程序相对偏移(program relative) label(label 必须是在当前指令的土4KB 范围内) 。 程序相对偏移是前索引形式的另一种版本。从PC 计算偏移量,并将PC 作为Rn 生成 前索引指令,不能使用后缀“!”,如: LDR R0,place ;place 地址装入R0 后索引偏移(post-indexed offset) [Rn],Flexoffset。在数据传送后,将偏移量Flexoffset 加到Rn 中,结果写回到Rn,Rn 不允许是R15,如: LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4 写入R1。 四、实验内容 (1)分析单寄存器操作,并学会简化给出的代码同时实现相同的效果; (2)使用多寄存器操作指令:LDMIA、STMIA实验上面单寄存器操作所实现的功能; (3)给出实验所提供的堆栈操作的代码执行过程的详细分析; (4)根据给出的用C写成的数码管显示,用相应的汇编实现同样功能。 五、实验程序 (1)单寄存器操作代码如下: AREA Lab1, CODE ENTRY START ADR R1,SRC ADR R2,DST COPY LDR R0,[R1] STR R0,[R2] ADD R1,R1,#0x4 ADD R2,R2,#0x4 LDR R0,[R1] STR R0,[R2] ADD R1,R1,#0x4 ADD R2,R2,#0x4 LDR R0,[R1] STR R0,[R2] STOP B STOP SRC DCB one small! ALIGN DST DCB three big! END 对以上这段用单寄存器操作实现的代码的分析:功能实现的就是将“one small!”穿送到“three big!”所在的内存空间,不过因为只是通过单寄存器来实现传送操作的,显得有些繁琐,这里是加一次数据,在分别给2个寄存器加地址,一共写了3段相同的代码才完成,下面我对这段不断重复的代码:LDR R0,[R1];STR R0,[R2];ADD R1,R1,#0x4;ADD R2,R2,#0x4加以修改,使用两条指令实现与上面代码相同的功能操作:简化如下:指令一:LDR R0,[R1],#0x4;指令二:STR R0,[R2],#0x4。 (2)多寄存器操作实验 尽管前一个实验在完成后,对繁琐的蛋寄存器操作加以简化,提高了一点效率,但是这是在寄存器之间传递数据,那么就有了更加高效的方法来实现相同的功能。那就是使用多寄存器操作指令:LDMIA、STMIA实验上面代码的功能。下面我给出了给出完整的代码实现: AREA Lab1, CODE ENTRY START ADR R1,SRC ADR R2,DST COPY LDMIA R1!,{R3,R4,R5} STMIA R2!,{R3,R4,R5} STOP B STOP SRC DCB one small! ALIGN DST DCB three big! END 对以上

文档评论(0)

docindoc + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档