程序取得所需空间的方法有两种:
- 在加载程序的时候为程序分配。
- 程序在执行的时候向系统申请。
我们若要一个程序在被加载的时候取得所需的空间,则必须在源程序中做出申明,我们通过在源程序中定义段来进行内存空间的获取。
我们若要CPU从何处开始执行程序,只要再源程序中用 “end 标号” 指明,程序框架如下:
assume cs:code
code segment
数据
start:
代码
code ends
end start //指明CPU从strat处开始执行
1.1 在代码段中使用数据 和 栈
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h //define words定义8个字数据空间 cs:00~cs:0E。
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //define words定义16个字数据空间,用来做栈空间 cs:10~cs:2E。
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 //将代码段中0~15单元中的8个字型数据依次入栈。
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0 //以上依次出栈8个字型数据到代码段0~15单元。
mov ax,4c00h
int 21h
codesg ends
ens start //指明入口在start处
1.2 将数据,代码,栈放入不同的段
在上述中,我们将数据,栈,代码放入了同一个段中,实际应用中应该将其分开,原因如下:
- 放入同一个段中显得混乱。
- 8086CPU一个段的容量不超过64KB。
方法:
assume cd: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,cs
mov ss,ax
mov sp,30h
mov bx,0
mov cx,8
s: push cs:[bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
codesg ends
ens start //指明入口在start处