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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验六ARM数据加载与存储指令实验 一、 实验目的 1、 熟悉教学ADS集成开发环境, 2、 懂得各种ARM寻址方式,并能自己动手写一些简单小程序。 3、 能够运行程序并进行简单分析 二、 实验环境 硬件:PC机一台。 软件:Windows98/XP/2000系统,ADS集成开发坏境。 三、 预备知识 LDR和STR——用于字和无符号字节 指令格式: LDR/STR{cond}{T) Rd, v地址〉 LDR/STR{cond}B{T} Rd, v地址〉 指令LDR{cond}{T} Rd, v地址〉,加载指定地址的字数据到Rd中;指令STR{cond){T) Rd, v地址〉,存储Rd中的字数据到指定的地址单元中。LDR{cond}B{T} Rd, v地址〉指令 加载指定地址的字节数据到Rd的的最低字节屮(Rd的高24位清零);STR{cond}B{T} Rd, v地址〉指令存储Rd中的最低字节数据到指定的地址单元中。T为可选后缀,若有T,那么 即使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下,T在用户模 式下无效,不能与前索引偏移一起使用T。地址部分可用的形式有4种: 零偏移(zero offset) [Rn], Rn的值作为传送数据的地址。如: LDR RO,[R1]; 前索引偏移(pre-indexed offset) [Rn, FlexoffsetJ{!)在数据传送之前,将偏移量Flexoffset 加到Rn中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn中, 35且Rn不允许是R15,如: LDRB RO,[R1,#8] LDR RO,[R1,#8]! 程序相对偏移(program relative) label (label必须是在当前指令的土 4KB范围内)。 程序相对偏移是前索引形式的另-?种版本。从PC计算偏移量,并将PC作为Rn生成 前索引指令,不能使用后缀“! ”,如: LDR RO,place ; place 地址装入 R0 后索引偏移(post-indexed offset) [Rn], Flexoffset.在数据传送后,将偏移量 Flexoffset 加到Rn中,结果写回到Rn, Rn不允许是R15,如: LDR RO,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址 R1+R2X4 写入 R1。 四、 实验内容 分析单寄存器操作,并学会简化给出的代码同时实现相同的效果; 使用多寄存器操作指令:LDM1A、STMIA实验上血单寄存器操作所实现的功能; 给出实验所提供的堆栈操作的代码执行过程的详细分析; 根据给出的用C写成的数码管显示,用相应的汇编实现同样功能。 五、 实验程序 单寄存器操作代码如下: AREA Labi, CODE ENTRY START ADR Rl,SRC ADR R2,DST COPY LDR ROJR1J STR R0JR21 ADDRl,Rl,#0x4 ADD R2,R2,#0x4 LDR RO,[R1J STR R0,[R2] ADDRl,Rl,#0x4 ADD R2,R2,#0x4 LDR R0JR1] STR R0JR2J STOP B STOP SRC DCB one small !H ALIGN DST DCB “three big!“ END 对以上这段用单寄存器操作实现的代码的分析:功能实现的就是将“one small!”穿送 到three big!所在的内存空间,不过因为只是通过单寄存器来实现传送操作的,显得有些 繁琐,这里是加一次数据,在分别给2个寄存器加地址,一共写了 3段和同的代码才完成, 卜-面我对这段不断重复的代码:LDR RO,[R1]; STR R0,[R2]; ADD Rl,Rl,#0x4; ADD R2,R2,#0x4加以修改,使用两条指令实现与上面代码相同的功能操作:简化如下:指令一: LDR RO,[R1], #0x4;指令二:STRR0,[R2], #0x4。 (2)多寄存器操作实验 尽管前一个实验在完成后,对繁琐的蛋寄存器操作加以简化,提高了一点效率,但是这 是在寄存器之间传递数据,那么就有了更加高效的方法来实现相同的功能。那就是使川多寄 存器操作指令:LDMIA、STMIA实验上而代码的功能。下而我给出了给出完整的代码实现: AREA Labi, CODE ENTRY START ADR Rl,SRC ADR R2,DST COPY LDMIAR1!,{R3 R4R5} STMIA R2!,{R3,R4,R5} STOP B STOP SRC DCB “one small! ALIGN DST DCB three big!1* END 对以上这段用多寄

文档评论(0)

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

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

1亿VIP精品文档

相关文档