6. 包含多个段的程序
6.1在代码段中使用数据
-
assume cs:code code segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h mov bx,0 mov ax,0 mov cx,0 s: add ax,cs:[bx] add bx,2;bx循环增加2,不断指向下一个数据所在 loop s mov ax,4c00h int 21h code ends end
dw
定义字型数据,所占内存空间大小为16个字节。定义的字型数据段地址在cs中,dw定义的数据处于代码段最开始(即偏移地址为0)。
这8个数据就在代码段的偏移0、2、4、6、8、A、C、E处,地址分别为:CS:0、CS:2······
-
让程序在编译、链接后可以在系统中直接运行
assume cd:code code segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h start: mov bx,0 mov ax,0 mov cx,8 s: add ax,cs:[bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
在程度的第一条指令前面加标号
start
、以及在end
后加start
,告知编译器入口以及程序结束位置
6.2 在代码段中使用栈
将数据倒序存放
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;用dw定义16个字型数据,在程序加载后,将取得16个字的内存空间,存放这个16个数据
;在后面程序用这段空间当做栈使用
start: mov ax,cs
mov ss,ax
mov sp,30h;将设置栈顶ss:sp指向cs:30
mov bx,0
mov cx,8
s: push cs:[bx]
add bx,2
loop s;依次入栈
mov bx,0
moc cx,8
s0: pop cs:[bx]
add bx,2
loop s0;出栈
mov ax,4cooh
int 21h
codesg ends
end start
6.3 将数据、代码、栈放入不同的段
assune cs:code,ds:data,ss:stack;开始定义多个段
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stact segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack;段地址的引用
mov ss,ax
mov sp,20h;设置栈顶ss:sp指向stack:20
mov ax,data
mov ds,ax;ds指向data段
mov bx,0;ds:bx指向data段第一个单元
mov cx,8
s: push [bx]
add bx,2
loop s;依次入栈
mov bx,0
mov cx,8
s0: pop [bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start