汇编语言作业之实验五
---恢复内容开始---
任务一 将下面的程序编译连接,用debug加载,跟踪然后回答问题
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends
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
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
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
end start
![](https://img2018.cnblogs.com/blog/1498209/201811/1498209-20181130170935742-626451122.jpg)
如图:编辑链接过后可以看到(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加载,跟踪然后回答问题
![](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)
(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加载,跟踪然后回答问题
![](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操作后
---恢复内容结束---