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 ; 設(shè)置棧頂 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 個字?jǐn)?shù)據(jù)依次入棧
loop s
mov bx,0
mov cx,8
s0: po [bx]
add bx,2 ; 以上依次出棧 8 個字?jǐn)?shù)據(jù)到 data 段的 0~15 單元中
loop s0
mov ah, 4ch ; 退出
int 21h
code ends
end start
說明:
1依痊、定義多個段的方法
我們從程序中可明顯的看出素跺,定義不同的段要有不同的段名。
2引镊、對段地址的引用
程序中有了多個段朦蕴,如何訪問段中的數(shù)據(jù)呢?當(dāng)然要通過地址弟头,而地址分為段地址和偏移地址吩抓;在程序中段名就相當(dāng)于一個標(biāo)號,它代表了段地址赴恨,所以指令 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]
因?yàn)橹噶?mov ds,data
是錯誤的,不允許將一個數(shù)直接送入段寄存器中惑淳。
?