6.0 概述
前面的程序中,只有一个代码段,如果程序需要其他空间来存放数据,使用哪里呢?
第5章讲过,0:200~0:2ff是相对安全的内存空间,但大小只有256个字节,如果我们需要的空间超过256个字节,就需要向系统申请。
程序取得所需要的空间的方法有两种,一是在加载时分配,二是执行过程中向系统申请,本课程不讨论第二种方法。
我们若要在一个程序被加载时取得所需空间,必须要在源程序中作出说明,我们通过在源程序中定义段来进行内存空间的获取。
6.1 在代码段中使用数据
示例程序:
assume cs:code
code 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 21
code ends
end
注:其中,dw是"define word"的缩写,即定义字型数据。
该程序中定义的数据处于代码段中,地址为CS:0,CS:2,CS:4,CS:6,CS:8,CS:A,CS:C,CS:E。
程序编译链接后无法正常执行,因为代码段的入口是数据,不是指令。可以用end伪指令来指明程序入口。
assume cs: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 21
code ends
end start
>>>>一个可执行文件由描述信息和程序组成,程序来自于源程序中的汇编指令和定义的数据;描述信息则主要是编译、连接程序对源程序中相关伪指令进行处理得到的信息<<<<
6.2 在代码段中使用栈
示例程序:
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
mov ss,ax
mov sp,30
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
code ends
end start
6.3 将数据、代码、栈放入不同的段
(1) 定义多个段的方法
与定义代码段的方法没有区别,只是不同的段要有不同的段名。
(2) 对段地址的引用
在程序中,段名就相当于一个标号,它代表了段地址。
(3) 数据段、代码段、栈段,完全是我们自己的安排
实验5 编写、调度具有多个段的程序
略