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