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
是錯誤的,不允許將一個數直接送入段寄存器中。
?