- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
. .
实验名称:寻址方式和指令系统
姓名: 学号:
实验班号: 机器号:
实验目的
了解MSP430FG2xxx汇编格式指令和常用寻址方式;
了解C语言函数调用过程;
通过反汇编C程序代码.掌握研究计算机底层问题的基本方法。
实验任务
汇编格式指令和寻址方式的学习
L4_instruction.c 源程序见程序清单.建立 C 项目.进入 DEBUG 状态.点击 view/disassembly.在反汇编窗口得到 L4_instruction.c 对应的汇编格式指令程序代码。阅读该程序的汇编格式代码.思考:1) 在反汇编的 main( )函数中.分析代码里用到了哪些指令?哪几种寻址方式?
答:代码里使用了MOV.AND.BIS.XOR.CALL.JMP指令.使用了立即数寻址、寄存器寻址、绝对地址寻址、相对地址寻址这几种寻址方式。2) 修改 L4_ instruction.C.将变量 j 定义为全局变量.运行程序.观察实验现象.与 j 是局部变量时有什么不同.分析为什么?答:j的值由存储在寄存器R15中变为了存储在内存(RAM)中.寻址方式也由寄存器寻址变为绝对地址寻址。因为寄存器中存储的变量的生命周期较短.故寄存器适合存储像局部变量这样的短生命周期变量.而内存中存储的变量生命周期较长.故内存适合存储像全局变量这样的长生命周期的变量。3) 修改 L4_ instruction.C.将变量 i 的类型从 unsigned int 类型.改为 unsigned long 类型.反汇编看看 delay 函数的代码发生了什么变化?
答:函数的代码中i由仅由一个寄存器(R12)存储变为了由两个寄存器(R12.R13)存储.使i能取到更大的值.与其有关的运算也发生了变化.变得更加复杂了.j能取的值的范围不变.但却多占用了一个寄存器R14来使其能够与占用两个寄存器的i进行比较.其中R14用于存储j 的值.而R15的存储值一直为0。
改变前 改变后4) 在 3)的基础上.将变量 j 的类型从 unsigned int 类型.改为 unsigned long 类型.反汇编看看delay 函数的代码又发生了什么变化?
答:函数的代码中R15的存储值不再一直为0.j由实际上仅由一个寄存器(R14)存储变为了由两个寄存器(R14.R15)存储.使j也能取到更大的值.与其有关的运算也发生了变化.变得更加复杂了。
改变后5) (提高) 若将 L4_ instruction.C 中的 delay 函数改写为下面方式.请反汇编比较不同的实现。(1) void delay( unsigned int i ) //延时函数{ unsigned int j;for (j=i; j0; j--); }(2) void delay( unsigned int i ) //延时函数{ while(i--); }
答:
中程序在执行循环体的时候先将寄存器R12中存储的值减一.再判断R12所存值的正负.若值为正.则程序回到将R12所存值减一处.进行下一次循环;若值不为正.循环结束。
中程序在执行循环体的时候先将寄存器R12中存储的值存入寄存器R15中.再将寄存器R15中存储的值存入寄存器R12中.随后再判断R15所存值的正负.若值为正.则程序回到将寄存器R12中存储的值存入寄存器R15中处.进行下一次循环;若值不为正.循环结束。
6) (提高) 点击图标 .复位程序。用单步执行命令 F11 从 main 函数入口重新执行程序.在main 函数调用 delay 函数处.用 View/Register 和 View/Memory(或用 View/Stack) 查看并记录在跟踪调用 delay 函数时 call #delay 指令前后、以及从 delay 函数返回 main 函数( ret 指令)前后堆栈指针寄存器 SP、堆栈存储区域的内容变化.同时关注这些内容与 PC 指针寄存器、程序代码存放位置(地址)的关系。
答:
在call #delay 执行前:
SP=0x03FE 堆栈:0x03FE 0x08
0x03FF 0xC0
在call #delay 执行后.ret执行前:
SP=0x03FC 堆栈:0x03FC 0x38
0x03FD 0xC0
0x03FE 0x08
0x03FF 0xC0
在ret执行后:
SP=0x03FE
文档评论(0)