將數據、代碼、棧放入不同的段:把這些內容全部放在代碼段中無疑會讓程序顯得混亂而且難以管理和操作,容易出錯,所以,要把數據、代碼和棧放入不同的段中,這也體現了軟件工程中“分而治之”的思想
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
;dw的意思是“define word”,即定義了已連串的字型數據(後面8個數據)
data ends
stack segmetn
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
mov ax, data
mov ds, ax
mov bx, 0
mov cx, 8
s:
push [bx]
add bx, 2
loop s
mov bx, 0
mov cx, 8
s0:
pop [bx]
add bx, 2
loop s0
mov ax, 4c00h
int 21h
code ends
end start
定義多個段的方法:定義數據段和棧段跟定義代碼段一樣,都是:XXX segment ; XXX ends;
對段地址的引用:如何訪問到段的開始地址,尋址是按照:段地址×16 + 偏移地址來實現的。每一個段的標號就是表示段地址,比如:data segment;中data就是數據段的段地址。
mov ax, data
mov ds, data
就是使ds指向了data段中的第一個單元,那麼以後:mov [0], ax; 就是把ax的內容送入到data段開始的第一個內存單元;但是,我們不能這樣寫:mov ds, data; data其實是一個段地址,一個值,這樣寫相當於把值直接送入ds,這是不允許的。
要注意,所謂的數據段,代碼段,棧段都是我們自己定義的,是爲了方便程序員閱讀的,CPU並不知道哪些就是數據段,哪些是代碼段,哪些是棧段。所以,data, code, stack只是一系列的標號而已,標號就是爲了提高可讀性。assume cs:code, ds:data, ss:stack;這句只是將你定義的具有一定用途的段和相關的寄存器聯繫起來,並不是說,CPU知道cs指向了code, ds指向了data,ss指向了stack;所以,我們仍然需要在程序中寫:
mov ax, stack
mov ss, ax
mov sp, 20h
這樣類似的指令來指明ss指向了stack。所以,code, data, stack完全可以換成其他名字,只是我們在定義的時候需要定義一個可讀性比較強的標號。