南京信息工程大学实验报告
实验(实习)名称 编写、调试具有多个段的程序 实验(实习)日期 2018年12月3日 得分 指导老师 耿学华
系 计软院 专业 计科 年级 2017级 班次 5 姓名 沈筱月 学号 20171308198
一、实验目的
- 理解和掌握将数据、代码、栈放入不同的程序的编写和调试
- 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
二、实验准备
- 结合第6章教材和课件,复习第六章内容
- 复习第三章 栈 的知识
三、实验内容
教材133 实验 5
ps:
- 实验 5 相关提示见本文档最后一部分
- 为提高实验效率,已将实验5 的程序框架准备好,可以文件中心实验文件夹下载实验5 程序框架
四、实验结论
1、将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。
首先,在debug中编译、连接
然后用debug加载、跟踪
回答问题
- CPU执行程序,程序返回前,data段中的数据为:0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
- CPU执行程序,程序返回前,cs=076C ,ss=076B ,ds=076A
- 程序加载后,code段的段地址为X,则data段的段地址为: X-2 ,stack段的段地址为: X-1
2、将下面的程序编译、连接,用debug加载、跟踪,然后回答问题
首先进行编译,连接
回答问题
- CPU执行程序,程序返回前,data段中的数据为:0123H, 0456H
- CPU执行程序,程序返回前,cs=076C ,ss=076B ,ds=076A
- 设程序加载后,code段的段地址为X ,则data段的段地址为:X-2 ,stack段的段地址为:X-1
-
对于如下定义的段:
name segment
......
name ends
如果段中的数据占N个字节则程序加载后,该段实际占有的空间为: (N/16+1)*16
3、将下面的程序编译、连接,用debug加载、跟踪,然后回答问题
首先进行编译、连接
再用debug加载、跟踪
回答问题
- CPU执行程序,程序返回前,data段中的数据为:0123h, 0456h
- CPU执行程序,程序返回前,cs=076A ,ss=076E ,ds=076D
- 程序加载后,code段的段地址为X,则data段的段地址为:X+3 ,stack段的段地址为:X+4
4、如果将(1)、(2)、(3)题中最后一条伪指令 “end start" 改为 ”end" (也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
修改ex5_1.asm
再debug
从中我们可以发现执行反汇编之后不再是原来的指令了
继续修改ex5_2.asm
再debug
从中我们又可以发现,进行反汇编之后,ex5_2.exe也不再是原来的指令了
最后修改ex5_3.asm
从中我们发现,ex5_3.asm修改过后执行反汇编操作,得到的指令与原来一致
原因是:ex5_3.asm 相比于 ex5_1.asm 和 ex5_2.asm 它的代码段放在了最前面,而不指明程序的入口时,cup 将前两个实验的先存放的数据错误当成指令读入了,而 ex5_3.asm 没有影响。
5、程序如下,编写 code 段中的代码,用 push 指令将 a 段中的前8个字型数据,逆序存储到 b 段中
首先进行编译、连接
再debug运行
执行结果为:02 04 06 08 0A 0C 0E 10
6、程序如下,编写code段中的代码,用push指令将a段中的8个字型数据,逆序存储到b段中
首先进行编译、连接
再debug
结果完成了逆序存储。
五、总结与体会
通过此次实验,让我更加了解什么是数据段,代码段,栈段,以及三个段同时在一个程序的运行顺序,并且对 loop 循环指令以及多个程序段的源码执行文件和预分配空间命令有了进一步的了解。
再用debug进行加载、跟踪