一、实验目的
1. 理解和掌握将数据、代码、栈放入不同段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
二、实验准备
1. 结合第 6 章教材和课件,复习第 6 章内容
2. 复习第 3 章「栈」的知识
三、实验内容
(1)将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。
①CPU执行程序,程序返回前,data段的数据为多少?
见下图d 0770:0000 000f结果。
②CPU执行程序,程序返回前,cs= 0772h 、ss= 0771h 、ds= 0770 h 。
③设程序加载后,code段的段地址为X,则data段的段地址为 X-2 、stack段的段地址为 X-1。
执行结果截图如下:
(2)将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。
(1)CPU执行程序,程序返回前,data段中的数据 不变 。
(2)CPU执行程序,程序返回前,CS= 076CH ,SS= 076BH ,DS= 076AH 。
(3)设程序加载后,CODE段的段地址为X,则DATA段的段地址为 X-2 ,STACK段的段地址为 X-1 。
(4)对于如下定义的段:
name segment
……
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为 ((N+15)/16)*16 。
运行结果截图:
(3)将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。
(1)CPU执行程序,程序返回前,data段中的数据 不变 。
(2)CPU执行程序,程序返回前,CS= 076AH ,SS= 076EH ,DS= 076DH 。
(3)设程序加载后,CODE段的段地址为X,则DATA段的段地址为 X+3 ,STACK段的段地址为 X+4 。
调试结果截图:
(4)如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?说出原因。
根据以上的分析可得,我认为(3)仍然可以继续执行,因为(1)和(2)都改变了原来SS的值。
(5)程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存放到c段中。
调试结果截图:
四、实验结论
通过本次实验,发现自己还存在许多不足,对前面的知识点的掌握不够清晰,也不够牢固。