汇编语言作业之实验五

---恢复内容开始---

任务一  将下面的程序编译连接,用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操作后

 

 
 
 
 
 
 
 

---恢复内容结束---

posted @ 2018-11-30 19:03  Jaden233  阅读(370)  评论(1编辑  收藏  举报