第六节:包含多个段的程序
程序取得所需空间的方法有两种,一是在加载程序的时候为程序分配,再就是程序再执行的过程中向系统申请。
1. 在代码段中使用数据:
将8个数据的和存储在一组地址连续的内存单元中,计算和,结果存在ax寄存器中:
assume cs;code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start: mov bx,0
mov bx,0
mov cx,8
s:add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
dw的含义:定义字型数据,define word,使用dw定义8个字型数据,所占的内存空间的大小为16个字节
由于这8个数据在代码段中,程序在运行的时候CS中存放代码段的段地址。
由于dw定义的数据处于代码段的最开始,所以偏移地址为0。
End定义了程序的入口,即CS:IP指向程序的第一条要执行的指令。在编译,连接后,由“end,start” 指明的程序入口,被转化为一个入口地址,存储在可执行文件的描述信息中。
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 ;以上将代码0~15单元的8个数据入栈
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0 ;以上依次出栈8个字型数据到代码段中
mov ax,4c00h
int 21h
codesg ends
end start
3. 将数据,代码,栈放入不同的段:
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 ;以上将代码0~15单元的8个数据入栈
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0 ;以上依次出栈8个字型数据到代码段中
mov ax,4c00h
int 21h
codesg ends
end start
1. 定义多个段的方法:对于不同的段,要有不同的段名。
2. 对段地址的引用。段名相当于一个标号,代表段地址,mov ax,data 的含义就是将名称为data的段的段地址送入ax。程序data段中的数据0abch的地址就是data:6要将它送入bx中,mov ax,data mov ds,ax mov bx,ds:[6]