汇编-6.3-将数据、代码、栈存入不同的段
1.将数据、栈、代码存入到一个段中使得程序显得混乱。
2.如果数据、栈、代码需要的空间超过64KB,就不能放在一段中(一个段的容量不能大于64KB(8086CPU的16位的,段的大小2^16Byte))。
3.可以通过定义代码段的方法来定义多个段,然后再在段里面定义需要的数据,或者通过定义数据来取得栈的空间。
程序6.4
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,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 ;以上将data段中的0~15单元的8个字型数据依次入栈
mov bx,0
mov cx,8
s0:pop [bx]
add bx,2
loop s0 ;以上依次将8个字型数据出栈到data段的0~15单元中
mov ax,4c00h
int 21h
code ends
end start
说明:
(1).定义多个段和定义代码段没有区别,只是要求不同的段有不同的段名。
(2).段地址的引用,通过段地址和偏移地址。
(3).“代码段”、“数据段”、“栈段”的安排;
为数据命名为“data”,代码段命名为“code”,栈空间命名为“stack”,并且使用“s”,”s0”等标号便于阅读。
使用伪指令“assume cs:code,ds:data,ss:stack”将cs、ds、ss分别与code,data,stack段相联。
在源程序的最后用“end start”说明了程序的入口,这个入口将被写入可执行文件的描述信息,可执行文件中的程序被加载入内存后,CPU的CS:IP被设置指向这个入口,从而开始执行程序的第一条指令。
mov ax,stack
mov ss,ax
mov sp,20h
标号“start”在“code”段中,这样CPU就将code段中的内容当作指令来执行了。
设置ss指向stack,设置ss:sp指向stack:20,CPU执指令后,将把stack段当作栈空间来用。CPU若要访问data段中的数据,则可以用ds指向data段,用其他寄存器(如bx)来存放data段数据的偏移地址。
定义段的内容如何处理,是当作栈空间,还是数据,还是指令来执行,完全是靠程序的具体汇编指令,和汇编指令对CS:IP、SS:SP、DS等寄存器的设置来决定。
代码段(code段)的段基址是有CPU自动装入cs段寄存器中,数据段(ds段)和堆栈段(ss段)的段基址要人为在assume指令后装入。