实验 5 编写、调试具有多个段的程序
题目:将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。
实验(1)截图如下:
自己调试如下:
结论:
①通过观察0770:0000结果可以发现,data段的数据在执行程序后,程序返回前并未改变。
②CPU执行程序,程序返回前,cs= 0772h 、ss= 0771h 、ds= 0770 h
③code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
实验(2)截图如下:
①与(1)的结果一样,data段的数据在执行程序后,程序返回前仍未改变,仍是原始数据。
②CPU执行程序,程序返回前,cs= 0772h 、ss= 0771h 、ds= 0770 h
③设程序加载后,code段的段地址为X,则data段的段地址为 X-2 、stack段的段地址为 X-1
④对于如下定义的段:
name segment
.........
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为 (N/16+1)*16
实验(3)调试截图如下:
①可以发现,data段的数据在执行程序后,程序返回前并未改变,仍是原始数据。
②从图中可以看出,CPU执行程序,程序返回前,cs=0770h、ss= 0774h、ds=0773h。
③进一步可以发现,若code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。
实验(4)如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?说出原因。
答:(1)(2)改变前后SS发生变化,都是数据先加载进内存,所以不能正确运行。(3)是代码段先被加载进内存,所以能够运行且执行正确。
实验(5)程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存放到c段中。
实验(6)程序如下,编写code段中的代码,用push指令将a段中的前8个字符型数据,逆序存储到b段中。
添加程序:
mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,16
mov bx,0
mov cx,8
s:push ds:[bx]
inc bx
loop s
mov ax,4c00h
int 21h
如图可见正确