实验5 编写、调试具有多个段的程序

实验内容

(1)将下面的程序编译、连接,用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

 

CPU执行程序,程序返回前,data段中的数据为多少?

   0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

CPU执行程序,程序返回前,cs= 076C ,ss= 076B ,ds= 076A 

设程序加载后,code段的段地址为X,则data段的段地址为 X-2 ,stack段的段地址为 X-1 

 

(2)将下面的程序编译、连接,用debug加载、跟踪,然后回答问题

assume cs:code, ds:data, ss:stack
data segment
      dw 0123h, 0456h
data ends

stack segment
      dw 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

 

CPU执行程序,程序返回前,data段中的数据为多少?

    0123h,0456h

CPU执行程序,程序返回前,cs= 076C  ,ss= 076B  ,ds= 076A  。

设程序加载后,code段的段地址为 X ,则data段的段地址为 X-2 ,stack段的段地址为 X-1 

对于如下定义的段:

name segment

......

name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为((N+15)/16)*  16 个字节

 

(3)将下面的程序编译、连接,用debug加载、跟踪,然后回答问题

assume cs:code, ds:data, ss:stack

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


data segment
    dw 0123h, 0456h
data ends

stack segment
    dw 0,0
stack ends
end start

 

 

CPU执行程序,程序返回前,data段中的数据为多少?

    0123h,0456h

CPU执行程序,程序返回前,cs= 076A ,ss= 076E ,ds= 076D 

设程序加载后,code段的段地址为X,则data段的段地址为 X+3 ,stack段的段地址为 X+4

 

(4)如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因

       (1)、(2)不能正确执行,(3)能正确执行

       将最后一条伪指令“end start”改为“end”,相当于不指明程序入口,程序就会从加载进内存的第一个单元起开始执行。

       (1)、(2)中,都是数据先加载进内存,CPU会误把数据当成指令执行;(3)则是代码段先被加载进内存,因而可以被正确执行。

 

(5)程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中

assume cs:code

a segment

     db 1,2,3,4,5,6,7,8

a ends

b segment

     db 1,2,3,4,5,6,7,8

b ends

c1 segment

     db 0,0,0,0,0,0,0,0

c1 ends

code segment

start:

      ?

code ends

end start

程序源代码

 

截图

 

 

(6)程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中

assume cs:code

a segment

      dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0dh,0fh,0ffh

a ends

b segment

      dw 0,0,0,0,0,0,0,0

b ends

code segment

start:    

      ?

code ends

end start

 程序源代码

 

截图

 

posted @ 2018-11-30 19:49  儿茶  阅读(174)  评论(1编辑  收藏  举报