包含多个段的程序

6.1在代码段中使用数据


assume cs.codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
mov bx,0
mov ax,0
mov cx,8
s: add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end


dw的含义是定义字型数据 define word(数据之间用逗号分隔)
db的含义是定义单字节数据define byte
上述8个字型数据存放在CS代码段里
因为用dw定义的数据处于代码段的最开始,所以偏移地址为0,这8个数据就在代码段的偏移0、2、4、6、8、A、C、E处。
如果需要让程序在编译后可以存系统中直接运行,我们需要在源程序中指明程序的入口


assume cs.codesg
codesg segment
dw 0123h,0456h,0789h,0abch,Odefh,0fedh,0cbah,0987h
start: mov bx,0
mov ax,O
mov cx,8
s: add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends

end start

end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。

6.2在代码段中使用栈


codesg segment
dw 0123H,0456H, 0789H, 0abcH, 0defH, 0fedH,0cbaH,0987H
dw 0,0,0,0,0,0,0,0 ;用dw定义8个字型数据,在程序加载后,将取得8个字的
;内存空间,存放这8个数据。我们在后面的程序中将这段
;空间当作栈来使用。
start: mov ax, cs
mov ss, ax
mov sp,32 ;设置栈顶ss:sp指向cs:32
mov bx,0
mov cx, 8
s: push cs: [bx]
add bx,2
loop s ;以上将代码段016单元中的8个字型数据依次入栈
mov bx, 0
mov cx, 8
s0: pop cs: [bx]
add bx,2
loop s0;以上依次出栈8个字型数据到代码段0
16单元中
mov ax, 4c00h
int 21h
codesg ends

end start ;指明程序的入口在start处

6.3将数据、代码、栈放入不同的段

但如果数据、栈和代码需要的空间超过64KB,就不能放在一个段中(一个段的容量不能大于64KB,是我们在学习中所用的8086模式的限制,并不是所有的处理器都这样)。

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
mov cx,8
s:push [bx]
add bx,2
loop s

mov bx,0
mov cx,0
s0:pop [bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends

end start