Talk is cheap. Show me the code!
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0abch,0987h,0657h,0324h,0523h,0687h
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
add sp,20h ; 设置栈顶 ss:sp 指向 stack:20
mov ax,data
mov ds,ax
add bx,0 ; ds:bx 指向 data 段中的第一个单元
mov cx,8
s: push [bx]
add bx,2 ; 以上将 data 段中的 0~15 单元中的 8 个字数据依次入栈
loop s
mov bx,0
mov cx,8
s0: po [bx]
add bx,2 ; 以上依次出栈 8 个字数据到 data 段的 0~15 单元中
loop s0
mov ah, 4ch ; 退出
int 21h
code ends
end start
说明:
1、定义多个段的方法
我们从程序中可明显的看出,定义不同的段要有不同的段名。
2、对段地址的引用
程序中有了多个段,如何访问段中的数据呢?当然要通过地址,而地址分为段地址和偏移地址;在程序中段名就相当于一个标号,它代表了段地址,所以指令 mov ax,data
的含义就是将名称为 data
的段的段地址送入 ax
,一个段中的段地址可由段名代表,偏移地址就要看它在段中的位置了,程序中 0abdh
的地址就是 data:2
要将它送入 bx
中。
可以用如下代码:
mov ax,data
mov ds,ax
mov bx,ds:[2]
不能用下面的代码:
mov ds,data
mov bx,ds:[2]
因为指令 mov ds,data
是错误的,不允许将一个数直接送入段寄存器中。