欢迎来到天天文库
浏览记录
ID:47449624
大小:273.28 KB
页数:9页
时间:2019-08-24
《实验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)在3)的基础上,将变量j的类型从unsi
4、gnedint类型,改为unsignedlong类型,反汇编看看delay函数的代码又发生了什么变化?..答:函数的代码中R15的存储值不再一直为0,j由实际上仅由一个寄存器(R14)存储变为了由两个寄存器(R14,R15)存储,使j也能取到更大的值,与其有关的运算也发生了变化,变得更加复杂了。改变后5)(提高)若将L4_instruction.C中的delay函数改写为下面方式,请反汇编比较不同的实现。(1)voiddelay(unsignedinti)//延时函数{unsignedintj;for(j=i;j>0;j--);}(2)
5、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堆栈:0x03FE0x08..0x03FF0xC0在call#delay执行后,ret执行
7、前:SP=0x03FC堆栈:0x03FC0x380x03FD0xC00x03FE0x080x03FF0xC0在ret执行后:SP=0x03FE堆栈:0x03FE0x080x03FF0xC0其中0xC038为delay函数结束后的下一条程序代码所存放的地址,在ret执行后,该值会被赋给PC指针寄存器。2.通过反汇编查找程序问题程序L4_problem1.c欲实现按下P1.2连接的按键K3,则点亮P2.0连接的灯L1;释放按键K3,就熄灭L1。可程序运行的结果是L1不随按键K3的动作而变化。通过反汇编查看L4_problem1.c对应的汇编
8、指令程序,发现实际执行的代码并没有与条件判断相关的代码。请解释问题出在哪里?为什么有问题的程序编译能通过呢?答:问题出在if语句中的P1本应为P1IN,由于P1的值为0x0002,故P1&BIT2必为0,所
此文档下载收益归作者所有