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

一、实验任务

完成教材133实验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

 

用u指令反汇编,g指令执行到001d前,得到程序返回前。

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

 

(2)CPU执行程序,程序返回前,cs=076c、ss=076b、ds=076a。

(3)设程序加载后、code段段段地址为X,则data段的段地址为X-2,stack段的段地址为X-1(通过反汇编可以得到)。

 

 2、运行ex5_2 debug(操作同1)

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

(2)CPU执行程序,程序返回前,cs、ss、ds的值。

 

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

(4)对于如下定义的段:

name segment

...

name ends

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

在8086CPU架构中,每个段都是以16字节来对齐的,即若段数据在16字节以内,也计作16字节。

 

 3、运行ex5_3 debug

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

(2)CPU执行程序,程序返回前,cs、ss、ds的值。

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

 

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

 (1)(2)无法执行,因为(1)(2)以数据段开始,找不到程序入口无法执行第一条语句。(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

c segment  
  db 8 dup(0)
c ends      
code segment
start:mov bx,0
      mov dx,0
      mov cx,8
s:mov dx,0
  mov ax,a
  mov ds,ax
  add dx,[bx]
  mov ax,b
  mov ds,ax
  add dx,[bx]
  mov ax,c
  mov ds,ax
  mov [bx],dx
  inc bx
  loop s
  mov ax,4c00h
  int 21h
code ends
end start

·用t命令单步执行到mov [bx],dx之前,使得ds中保存的是c段的段地址。用d命令查看此时的c段中的内容。

 ·运行到程序结束前,d命令查看c段内容。

实验验证完毕。

 

6、编写code段中代码,用push指令将a段中的前八个字型数据逆序存储到b段中。

assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends

b segment
dw 8 dup(0)
b ends

code segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,10h
mov bx,0
mov cx,8

s:push [bx]
add bx,2h
loop s

mov ax,4c00h
int 21h
code ends
end start

用u指令反汇编、用g指令运行到程序返回前、用d指令查看b中内容。得到逆序。

 

总结:

了解了寄存器分段存储的相关知识,分段存储更加简洁明了,以及复习了栈的知识。实践时不够熟练,还是要多加练习。

 

posted @ 2018-11-25 23:05  idddddddd  阅读(241)  评论(0编辑  收藏  举报