欢迎来到天天文库
浏览记录
ID:39195824
大小:278.68 KB
页数:9页
时间:2019-06-26
《实验4寻址方式和指令系统方案》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、实验名称:寻址方式和指令系统姓名:学号:实验班号:机器号:一.实验目的1.了解MSP430FG2xxx汇编格式指令和常用寻址方式;2.了解C语言函数调用过程;3.通过反汇编C程序代码.掌握研究计算机底层问题的基本方法。二.实验任务1.汇编格式指令和寻址方式的学习L4_instruction.c源程序见程序清单.建立C项目.进入DEBUG状态.点击view/disassembly.在反汇编窗口得到L4_instruction.c对应的汇编格式指令程序代码。阅读该程序的汇编格式代码.思考:1)在反汇编的main()函数中.分析
2、代码里用到了哪些指令?哪几种寻址方式?答:代码里使用了MOV.AND.BIS.XOR.CALL.JMP指令.使用了立即数寻址、寄存器寻址、绝对地址寻址、相对地址寻址这几种寻址方式。2)修改L4_instruction.C.将变量j定义为全局变量.运行程序.观察实验现象.与j是局部变量时有什么不同.分析为什么?答:j的值由存储在寄存器R15中变为了存储在内存(RAM)中.寻址方式也由寄存器寻址变为绝对地址寻址。因为寄存器中存储的变量的生命周期较短.故寄存器适合存储像局部变量这样的短生命周期变量.而内存中存储的变量生命周期较长
3、.故内存适合存储像全局变量这样的长生命周期的变量。3)修改L4_instruction.C.将变量i的类型从unsignedint类型.改为unsignedlong类型.反汇编看看delay函数的代码发生了什么变化?答:函数的代码中i由仅由一个寄存器(R12)存储变为了由两个寄存器(R12.R13)存储.使i能取到更大的值.与其有关的运算也发生了变化.变得更加复杂了.j能取的值的范围不变.但却多占用了一个寄存器R14来使其能够与占用两个寄存器的i进行比较.其中R14用于存储j的值.而R15的存储值一直为0。改变前改变后4)
4、在3)的基础上.将变量j的类型从unsignedint类型.改为unsignedlong类型.反汇编看看delay函数的代码又发生了什么变化?答:函数的代码中R15的存储值不再一直为0.j由实际上仅由一个寄存器(R14)存储变为了由两个寄存器(R14.R15)存储.使j也能取到更大的值.与其有关的运算也发生了变化.变得更加复杂了。..改变后5)(提高)若将L4_instruction.C中的delay函数改写为下面方式.请反汇编比较不同的实现。(1)voiddelay(unsignedinti)//延时函数{unsigne
5、dintj;for(j=i;j>0;j--);}(2)voiddelay(unsignedinti)//延时函数{while(i--);}答:(1)中程序在执行循环体的时候先将寄存器R12中存储的值减一.再判断R12所存值的正负.若值为正.则程序回到将R12所存值减一处.进行下一次循环;若值不为正.循环结束。(2)中程序在执行循环体的时候先将寄存器R12中存储的值存入寄存器R15中.再将寄存器R15中存储的值存入寄存器R12中.随后再判断R15所存值的正负.若值为正.则程序回到将寄存器R12中存储的值存入寄存器R15中处.
6、进行下一次循环;若值不为正.循环结束。6)(提高)点击图标.复位程序。用单步执行命令F11从main函数入口重新执行程序.在main函数调用delay函数处.用View/Register和View/Memory(或用View/Stack)查看并记录在跟踪调用delay函数时call#delay指令前后、以及从delay函数返回main函数(ret指令)前后堆栈指针寄存器SP、堆栈存储区域的内容变化.同时关注这些内容与PC指针寄存器、程序代码存放位置(地址)的关系。答:在call#delay执行前:SP=0x03FE堆栈:0
7、x03FE0x080x03FF0xC0在call#delay执行后.ret执行前:SP=0x03FC堆栈:0x03FC0x38..0x03FD0xC00x03FE0x080x03FF0xC0在ret执行后:SP=0x03FE堆栈:0x03FE0x080x03FF0xC0其中0xC038为delay函数结束后的下一条程序代码所存放的地址.在ret执行后.该值会被赋给PC指针寄存器。2.通过反汇编查找程序问题程序L4_problem1.c欲实现按下P1.2连接的按键K3.则点亮P2.0连接的灯L1;释放按键K3.就熄灭L1。可
8、程序运行的结果是L1不随按键K3的动作而变化。通过反汇编查看L4_problem1.c对应的汇编指令程序.发现实际执行的代码并没有与条件判断相关的代码。请解释问题出在哪里?为什么有问题的程序编译能通过呢?答:问题出在if语句中的P1本应为P1IN.由于P1的值为0x0002.故P1&BIT2必为0.所以
此文档下载收益归作者所有