实验五 编写、调试具有多个段的程序

(1)将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。

①CPU执行程序,程序返回前,data段的数据为多少?

见下图d 0770:0000 000f结果。

②CPU执行程序,程序返回前,cs= 0772h 、ss=  0771h  、ds= 0770 h  

③设程序加载后,code段的段地址为X,则data段的段地址为 X-2  、stack段的段地址为     X-1 

code段是代码段,段地址存放在寄存器cs中,data段是数据段,段地址存放在ds中,stack是栈段,段地址存在ss中。

(2)将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。

①CPU执行程序,程序返回前,data段的数据为多少?

见下图中0770:0000 0003结果。

②CPU执行程序,程序返回前,cs=  0772h    、ss=  0771h   、ds=  0770h   

③设程序加载后,code段的段地址为X,则data段的段地址为  X-2    、stack段的段地址为  X-1   

④对于如下定义的段:

name  segment

.........

name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为  (N/16+1)*16    。

(3)将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。

①CPU执行程序,程序返回前,data段的数据为多少?

见下图中的d 0773:0000 0003运行结果。

②CPU执行程序,程序返回前,cs=0770h、ss= 0774h  、ds=0773h 

③设程序加载后,code段的段地址为X,则data段的段地址为 X+3  、stack段的段地址为  X+4 

 

(4)如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?说出原因。

(为了方便验证结果,我将pop ds:[2]和pop ds:[0]语句删去首先,(1)未改之前:

程序(1)改后:

 

用r和t命令找到现在的SS,然后用g命令使程序运行结束,发现改变前后SS发生变化。

 

程序能够运行,但不能正确执行。

程序(2)改变前:

程序(2)改变后:

 

能运行,但不能正确执行。SS的值变成了20CD。

程序(3)改变前:

 程序(3)改变后:

 

 能够运行且执行正确。

(1)和(2)都改变了原来SS的值。

(5)程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存放到c段中。

 

 

结果正确相加。

这道题编写了好一会,一直是执行g命令后无响应,还以为是编的太复杂了改了好几遍,最后发现是AX赋值成了004C。。。。

(6)程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。

 

原文地址:https://www.cnblogs.com/Yangruzhang/p/10007587.html