---恢复内容开始---
任务一 将下面的程序编译连接,用debug加载,跟踪然后回答问题
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
如图:编辑链接过后可以看到(1)cpu执行程序,程序返回前,data段中的数据是 23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09;
(2)cpu执行程序,程序返回前,cs=076c,ss=076b,ds=076a;
(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
任务二 将下面的程序编译连接,用debug加载,跟踪然后回答问题
(1)cpu执行程序,程序返回前,data段中的数据为23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00;
(2)cs=076c,ss=076b,ds=076a;
(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
(4)对于如下定义的段:
name segment
。。。
name ends
如果段中的数据占n个字节,则程序加载后,该段实际占有的空间为(N/16+1)*16,
因为,对比实验(1)(2)可以发现,(1)中data段数据有16个字节,占用了16个字节空间,而(2)中data段数据只有4个字节,但实际上(2)也占用了16字节的空间,其中不足的部分都用0补全了。因此,推测出若段中数据为N个字节,则该段实际占用的空间为(N/16+1)*16个字节 。
任务三 将下面的程序编译连接,用debug加载,跟踪然后回答问题
(1)CPU执行程序,程序返回前,data段的数据为23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00;
(2)CPU执行程序,程序返回前,cs=076A、ss= 076E、ds=076D;
(3)设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为 X+4 ;
任务四 如果将(1)(2)(3)题中的最后一道伪命令end start改为end,也就是说不指明程序的入口,则哪个程序仍然可以正确执行?说明原因。
回答:只有(3)可以,因为1、2开始的都是数据段,将end start改为end后,相当于没有指明程序入口,此时程序就会从加载进程序的第一个单元开始执行。如果不指明入口位置,则程序从所分配的空间开始执行,前2个前面是数据段,只有从第3条开始是指令代码。那么在1、2中数据先加载进内存。cpu会把数据误当作指令因此不能正确执行,而三中没事。
任务五 程序如下,编写code段中的代码,将a、b段中的数据依次相加,将结果存入c段中。
编辑代码如下:
结果正确。
任务六 程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。
如图:
在执行push操作前:
执行push操作后
---恢复内容结束---