---恢复内容开始---
任务一 将下面的程序编译连接,用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







(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操作后

---恢复内容结束---
本文深入探讨16位汇编语言中数据段的使用与操作,包括不同程序编译链接后的段地址分配规律,数据段在执行过程中的变化,以及如何通过指令修改数据段内容。同时,文章提供了具体的程序实例,展示了如何实现数据段内数据的逆序存储和相加操作。
670

被折叠的 条评论
为什么被折叠?



