(1)程序返回前,data段中的数据:

程序返回前,cs=076c,ss=076b,ds=076a

code段地址为X,data段地址为X-2,stack段地址为X-1

(2)程序返回前,data段中的数据:

程序返回前,cs=076c,ss=076b,ds=076a

code段的段地址为X,则data段地址为X-2,stack段地址为X-1

对定义如下的段:

name segment:

...

name ends

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

(3)

程序返回前,data段中的数据:

 

程序返回前,cs=076a,ss=076e,ds=076d

code段的段地址为X,则data段地址为X+3,stack段地址为X+4

(4)

题(3)中的可以顺利执行,因为题(3)中代码段放在第一位,若不指明程序入口,默认第一个为程序入口。

(5)

源代码 :

 

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 0,0,0,0,0,0,0,0
c ends

code segment
start:    
    mov cx,8
    mov bx,0

s:             
    mov dl,0
    mov ax,a
    mov ds,ax
    add dl,[bx]
    
    mov ax,b
    mov ds,ax
    add dl,[bx]

    mov ax,c
    mov es,ax
    mov es:[bx],dl

    inc bx
loop s

mov ax,4c00h
int 21h

code ends
end start

 

截图:

未运行前:

运行后:

经过验证,实验数据确实相加了。

(6)源代码:

 1 assume cs:code
 2 a segment
 3     dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
 4 a ends
 5 
 6 b segment
 7     dw 0,0,0,0,0,0,0,0
 8 b ends
 9 
10 code segment
11 start:
12     mov cx,8
13     mov ax,a
14     mov ds,ax
15     mov ax,b
16     mov ss,ax
17     mov sp,10h
18     mov bx,0
19     
20 s:
21     push [bx]
22     add bx,2
23 loop s
24 
25     mov ax,4c00h
26     int 21h
27 code ends
28 end start

实验结果截图:

由图可知,运行前b段都为0,运行后将这八个字型数据逆序存入该段中。

二.总结与体会

在这一块中,我更多学习了关于多个段的程序编写的方法,而且了解到各个程序段我们该学会如何去安排他们。

通过不同段的存放,避免了长度不能超过64kb的问题,还是很实用的。