---恢复内容开始---
任务一 将下面的程序编译连接,用debug加载,跟踪然后回答问题
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
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
end start
![](https://img2018.cnblogs.com/blog/1498209/201811/1498209-20181130170935742-626451122.jpg)
![](https://img2018.cnblogs.com/blog/1498209/201811/1498209-20181130171947876-471340415.jpg)
![](https://img2018.cnblogs.com/blog/1498209/201811/1498209-20181130171956990-2025330243.jpg)
![](https://img2018.cnblogs.com/blog/1498209/201811/1498209-20181130172427920-58400067.jpg)
![](https://img2018.cnblogs.com/blog/1498209/201811/1498209-20181130173827595-1482048992.jpg)
![](https://img2018.cnblogs.com/blog/1498209/201811/1498209-20181130173837314-382090918.jpg)
![](https://img2018.cnblogs.com/blog/1498209/201811/1498209-20181130174055977-2121458625.jpg)
(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操作后
---恢复内容结束---