计硬基础实验报告2_第1页
计硬基础实验报告2_第2页
计硬基础实验报告2_第3页
计硬基础实验报告2_第4页
计硬基础实验报告2_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验名称:寻址方式和指令系统(实验4) 姓名: 学号: 实验目的1. 了解msp430g2xxx汇编格式指令和常用寻址方式;2. 了解c语言函数调用过程;3. 通过反汇编程序代码,掌握研究计算机底层问题的基本方法;4. 掌握计算机中数的表示和编码。实验基本任务1. 汇编格式指令和寻址方式的学习(可在simulator下完成)l4_l. c源程序见下,建立c项目,进入debug状态,点击view/disassembly,在反汇编 窗口得到l4_l.c汇编格式指令的程序代码,如图4-1和图4-2,阅读该程序的汇编格式代码, 思考:l4_l.c程序清单(提供电子版): include i()430.

2、 h" void delay();/unsigned int i;/定义全局变量int main ( void )wdtctl = wdtpw + wdthold;/关闭看门狗/设置端口 2为功能选择寄存器和2,使p2为基本输入输出功能,p2. 0连接l1指示灯ledp2sel二0;p2sel2=0;p20ut二oxff;p2dir二oxff; for (;) p2outp2out; delay ();;void delay() unsigned int i;for (i二0;i<0xffff;i+);/设置端口 2输出的初值为oxff/设置端口 2为输出方向/主循环/将端口

3、2的值取反后输出/延时/定义局部变量/延时1)程序用到了哪些指令?答:mov. w/call/clr b/mov. b/inv. b/jmp/push. w/decd. w/add. w/clr. w/jne/ret/br2)程序用到了哪几种寻址方式?答:立即数寻址、寄存器寻址、绝对地址寻址、寄存器相对寻址3)用单步执行命令f11,跟踪函数delay的调用和返回,用view/register和view/memory 查看堆栈指针sp和存储系统堆栈区域的内容,记录堆栈指针sp和堆栈内容的变化;答:程序刚开始时sp指向0x400,进入main函数之后sp自动-2变为0x03fe,执行delay 函

4、数时,sp变为0x03fc,在delay中sp的值一直为0x03fc, delay循坏结束sp又变为0x03fe, 之后一直循环变化。堆栈中只有r15的值发生变化,因为r15存放了变量i的值,因此不断 变化。4)修改l4_1.c,将变量i定义为全局变量,通过反汇编的代码,比较与定义为局部变量的 不同;答:汇编代码长度增加,变量i的存储地址rh r15变为ram里面的0x02005)修改l41.c,将变量i的类型从unsigned int类型,改为unsigned long类型,反汇 编看看函数delay的代码发生了什么变化?程序执行的结果有什么不同?为什么?(需在实 验板上运行)。答:dela

5、y函数的地址变到main函数上部,i由两个字节变为四个字节,delay函数的执 行时间变长,led灯的变化速率变慢。因为变量i从int变为long,因此i的增加速率变慢, delay函数的执行时间也就变长。设计连线:将p2.0引脚与l1相连,连线图如下:修改后的程序如下:#include "io430.h"void delay();/unsigned int i ;/定义函数变量int main ( void )wdtctl 二 wdtpw + wdthold;/关闭看门狗/设置端口 2为功能选择寄存器和2,使p2为基本输入输岀功能,12 0连接l1指示灯ledp2sel=

6、0;/设置端口 2输出的初值为oxff/设置端口 2为输岀方向/主循环/将端口 2的值取反后输出/延吋/定义函数变量/延时p2sel2二0;p20ut二oxff;p2dir=0xff; for (;) p20ut="p20ut; delay ();;void delay()unsigned long i ;for (i=0; koxffff; i+);2. 了解c语言程序的执行过程(可在simulator方式下完成)指令计数寄存器pc决定cpu取指令的地址,所以pc寄存器的内容决定了程序的流程。 已知msp430g2xxx单片机复位后,pc寄存器从存储器0xfffe0xffffh单元

7、获取一个字内 容作为执行第一条指令的地址。以l4_1.c的项目为例,请问实验屮查看到该地址的值是多 少?程序执行的第一条指令是什么指令? main函数的入口是单片机上电就被执行的第一条 语句吗?解:实验中pc寄存器执行第一条指令的地址的值是oxcooco程序执行的第一条指令是wdtctl = wdtpw + wdthold;/关闭看门狗00c00c40b2 5a80 0120mov.w#0x5a80,&udtctlmain函数的入口不是单片机上电执行的第一-条语句,第一条语句是初始化sp:program slstl:00c0004031 0400mov. w#0x400zsp? cs

8、t ar t_ca1l_ma i n:00c00412b0 c00ccal 1#main00c00812b0 c052call#exi tudtctlmain :=udtpu + udthold;/关闭看门狗在项目设置option/debugger/set up中,去除对run to前的选项,再将程序下载到单 片机中,观察当前上电复位pc的值与0xfffeoxffff存储单元内容的关系,对比不去除run to前的选项的不同。答:项目设置option/debugger/set up中去除对run to前的选项会指向初始化sp,不 去除run to前的选项则指向看门狗。项目设置option/deb

9、ugger/set up屮设置run to前的选项截图如下:?cstart_begin:program_s tart:oocooo4031 0400mov. w#0x400,sp?cstar t_call_main:00c00412b0 c00ccall#main00c00812b0 c052call#exi tudtctl = udtpu + udthold;/关闭看门狗main : ?cstart_end:00c00c40b25a80 0120mov. w#0x5a80.&udtctlp2sel=0;/设置端口 2为功能选择寄存器和2、使p2为.00c01243c2002eclr

10、b&p2selp2sel2=0;项目设置option/debugger/set up中去除对run to前的选项截图如下:? cs t ar t_beg i n:program_s tart:oocooo4031 0400mov. w#0x400zsp?cstart._call_main:00c00412b0 c00ccall#main00c00812b0 c052call#exi tudtctl = udtpu + udthold;/关闭看门狗main :?cstart._end:oocooc40b2 5a80 0120mov. w#0x5a80z&udtctlp2sel=0

11、;/设置端口 2为功能选择寄存器和2、使p2为.3. c语言中带初始化变量的定义及其实现(可在simulator下完成)如下程序l4_string. c,在debug下反汇编程序,比较一个数组分别定义成const型常 量、全局变量、局部变量三种不同形式,系统在初始值的实现上有何不同?提示:如任务2,在项目设置option/debugger/set up中,去除对run to前的选项,将程 序下载到单片机中,用view/disassembly反汇编查看程序的代码,分析和描述从上电复位后 执行的第一条指令,到maino函数中关闭看门狗的那条语句前,即wdtctl二wdtpw + wdth0ld 前

12、,这些程序代码的功能,理解编译器对const型常暈、全局变量、局部变量等不同的变量/ 常变量可能的分配,以及它们初始值设置的实现方法。程序清单:include io430h"const char string4 = oxab, 0x12, 0x71, 0x32 ;/第 l 种 const 型常量/char string4 = oxab, 0x12, 0x71, 0x32 ;/第 2 种 全局变量int main( void ) /char string4 = oxab, 0x12, 0x71, 0x32 ; /第 3 种 局部变量 char sum;unsigned int i;wd

13、tctl = wdtpw + wdthold;p2sel = 0;p2sel2 二 0;p2d1r 二 oxff;sum = 0;for( i =0; i<4; i+) sum = sum + (int)stringi;p20ut = sum;wh i1e(1);答:定义成const型常量:#include "io430.h"int main( void ) const char string4 = oxab, 0x12, 0x71, 0x32 ; /第种 局部变量 char sum;unsigned int i;wdtctl = wdtpw + wdthold;p2

14、sel = 0;p2sel2 = 0;p2dir = oxff;sum = 0;for( i =0; i<4; i+) sum = sum + (int)stringi;p20ut = sum;wh订e(l);00c0023271? cs t ar t_beg i n: uroqram start:jn0xbce600c0044031 0400mov w#0x400,sp由于数组己经被定义为const型,因此数组一开始就被分配在oxcooo中并完成初始化, 上面的代码完成了初始化sp和执行main函数的作用。定义成全局变量:00c0023271jn0xbce6? cs t ar t_be

15、g i n:_prograin_s t ar t:00c0044031 0400iflov . w#0x400zsp?csta.rt_.callain :00c00812b0 c010call#mainoocooc12b0 c052call#exi tudtctl = udtpu + udthold:数组被定义为全局变量吋开始没有被初始化,但是数组被分配在0x0200地址里,数组里 面数据储存在oxcooo屮,因此上电后开始执行初始化sp,已经将oxcooo的值赋给r13,将 0x0200赋给r12,接着跳转执行_datall6_mem卬y,并在memcpy函数里完成对数组初始化, 然后返回m

16、ain函数。定义为局部变量:include io430h"int ma.in( void ) char string4 = oxab, 0x12, 0x71, 0x32 ;/第 3 种 局部变量char sum;unsigned int i;wdtctl = wdtpw + wdthold;p2sel = 0;p2sel2 二 0;p2d1r = oxff;sum = 0;for( i =0; i<4; i+) sum = sum + (int)stringti;p20ut = sum;wh i1e (1);00c0023271jnoxbceg?cstart_begin:pro

17、gram_start:00c00440310400mov.w#0x400,sp?cstart_call_main:00c00812b0c010call#main00c00c12b0c06acall#exitint main( void ) char string 4 = oxab, 0x12,0x71 z 0x32 ;3 局main:?cstart end:00c0108221sub w#0x4,sp char string4 = oxab,0x12,0x71jdn32;/第 3种局00c012403f c000mov w#0xc000,r1500c0164ff1 0000mov br15+,

18、0x0(sp)00c01a4ff1 0001mov br15+,0xl(sp)00c01e4ff1 0002mov br15+z0x2(sp)00c0224ff1 0003mov br15+,0x3(sp)udtctl=udtpu + udthold;00c02640b2 5a80 0120mov w#0瓦5a80,&udtc:p2sel =0;00c02c43c2 002eclr b&p2selp2sel2=0;数组被泄义为局部变量时开始没有被初始化,也没有分配储存地址,但是数据里的数据 还是储存在0x0000中,上电后执行到main函数里初始化数组的语句时程序将0x0000

19、赋给r15, 接着用sp和r15完成初始化数据,并将数组分配在0x03fa屮。结合任务1和任务3给出的问题,总结如何利用反汇编c语言的程序代码,分析实验中 遇到的一些底层问题。答:利用反汇编手段分析c语言程序函数调用过程中堆栈的动态分配、变量的初始化方 式等细节,了解了高级语言程序在底层的具体实现,利于加深对变量、函数调用过程的理解, 理解高级语言中部分约定的底层根源,可以减少和避免使用中错误的发生。已完成的选做任务(选做)在第3种定义前,即局部变量前加static,看看有什么不同。答:在第3种定义前,即局部变量前不加static,情况如下图:oocooo12abcallr1100c00232

20、71jn0xbce6?cstart_.begin:_program_start:00c0044031 0400mov . v#0x400,sp?cstart_call_main:00c00812b0 c010call#mainoocooc12b0 c06acalljfexitint main( void )disassemblychar string4 = oxab, 0x12,0x71 z 0x32;/第3种 局部变00c012403fcooomov. v#0xc000,r1500c0164ff10000mov. br15+.0x0(sp)00c01a4ff10001mov. br15+z0

21、xl(sp)00c01e4ff10002mov. br15+,0x2(sp)00c0224ff10003mov. br15+z0x3(sp)udtctl=udtpu + wdthold;00c02640b25a80 0120mov. w#0x5a80.&qdtctlp2sel -0;00c02c43c2002eclr. b&p2selp2sel2=0;00c03043c20042clr. b&p2sel2p2dir =oxff :00c03443f2002amov. b#0 瓦 ff4p2dir char string 4 = oxab, 0x12 z 0x71 z 0

22、x32; /第 3种 局部变 wain:?cstart_end:00c0108221sub.w #0x4zsp在笫3种定义前,即局部变量前加static,情况如下图:disassemblyoocooo12abcallr1100c0023271jn0xbce6?cstart_.begin:_program_start00c00440310400mov. w#0x400,spvcstart.init:00c008403c0200mov. w#0x200,r12oocooc403dcooomov. w#0xc000,r1300c010403e0004mov. wxf0x4,r1400c01412b0

23、c078call#datal 6_metiicpy?cstart_call_main:00c01812b0c020call#main00c01c12b0c070call#exi tudtctl = udtpw + udthold;00c02040b2 5a80 0120mov. w#0x5a80.udtctlp2sel =0;00c02643c2 002eclr b&p2selp2sel2=0;00c02a43c2 0042clr. b&p2sel2p2dir =oxf f ;00c02e43f2 002amov. b#0xffp2dirsum = 0z00c032434eclr. br14for( i=0; i<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论