先上程序:
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
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,20h
mov ax,data
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
定义多个段:
定义多个段,就要使用segment…ends,注意的是,要用不同的段名,像上面面的程序,定义了3个段,code,data,stack就是段名
段地址:
code,data,stack就是段地址,比如我们要访问data段的数据:
mov ax,data
mov ds,ax
mov bx,0
push [bx]
将段地址data传送到ds段寄存器中,我们就可以访问了
注意:
- 代码段、数据段、栈段完全是我们的安排、我们在上面的程序中取了code,data,stack这些段,这些标号是我们自己取得,我们完全可以取其他名字
- 我们在使用:
assume cs:code,ds:data,ss:stack
assume是伪指令,是由编译器执行的,cpu并没有将cs指向code,ds指向data,ss指向stack
- 若要CPU按照我们的安排做事,就要用机器指令去控制它,比如说设置ss指向stack
mov ax,stack
mov ss,ax
mov sp,20h