[toc]
我们之前所有的程序里,都只有一个代码段。那么现在问题来了,我们程序如果需要用到其他空间来存放数据怎么办呢?
比如:
- 在一个段中存放数据、代码、栈。
- 将数据、代码、栈放入不同的段中。
考虑这样一个问题,编程计算以下8个数据的和,结果存在ax寄存器中:
0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
assume cs:code
code segment ;define word定义8个字型数据
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start:
mov bx,0 ;下标
mov cx,8
s:mov dx, cs:[bx]
add ax,dx
add bx,2
loop s
;return dos
mov ax,4c00h
int 21h
code ends
end start
利用栈,将程序中定义的数据逆序存放。
assume cs:code
code 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 ;作为栈使用
start:
mov ax,cs ;将栈段寄存器设置cs上
mov ss,ax
mov sp,30h;设置栈顶ss:sp -> 到栈底 cs:48
mov bx,0
mov cx,8
s:mov ax,cs:[bx]
push ax
add bx,2
loop s
mov cx,8
mov bx,0
s1:pop ax
mov ss:[bx],ax
add bx,2
loop s1
mov ax,4c00h
int 21h
code ends
end start
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,0,0,0,0,0,0,0,0
stack ends
;>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>
code segment
start:
mov ax,data;关联ds段
mov ds,ax
mov ax,stack;关联ss段
mov ss,ax
mov sp,32 ;设置栈顶
mov bx,0;下标 索引
mov cx,8;循环次数
s:push [bx]
add bx,2
loop s
mov bx,0
mov cx,8
s1:pop [bx]
add bx,2
loop s1
;程序退出
mov ax,4c00h
int 21h
code ends
end start