在執行匯程式設計序的時候,不要隨便向某個暫存器中賦值,這可能會導致系統錯誤,雖然現在的作業系統已經完全把硬體保護起來了,但是在安全模式下還是可以執行導致系統崩潰的命令。所以我們在編寫匯程式設計序的時候,要找到一段安全的空間供我們使用,在一般的pc機中,dos方式下,dos和其他合法的程式一般都不會使用0:200到0:2ff的256個位元組的空間,這就是一段安全空間。
我們有時需要編寫含有多個段的程式,程式取得所需空間的方法有兩種:引導程式的時候為程式分配、在程式執行的過程中向系統申請。這裡我們只討論第一種分配方式。
如果我們要完成乙個功能:計算8個資料的和,結果存在ax暫存器中。
這個功能涉及到乙個資料定義的過程,**如下:
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start: mov bx,0
mov ax,0
s: add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
其中dw命令就是define word的意思,代表定義了8個字型資料,它們一共佔16個位元組。這些資料的位址分別是cs:0、cs:2...cs:e。
start和end start構成了一對,表明程式是從start的位置開始執行指令的,它用來標記程式入口,當程式被載入進記憶體時,cs:ip就會指向start標記的位置,然後開始執行。
也就是說在這個程式中,start上面是資料部分,下面是**部分。
現在我們要完成乙個功能:在資料定義好後,把上述8個資料利用棧在原位置逆序存放。這裡我們必須開闢一片空間當做棧,我們依然可以用定義資料的方式來取得一段空間:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,30h 設定棧頂ss:sp指向cs:30
mov bx,0
mov cx,8
s: push cs:[bx]
add bx,2
loop s 將8個資料依次入棧
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0 從棧中將資料取出放到最初的位置
mov ax,4c00h
int 21h
codesg ends
end start
這裡定義了16個0,其實根本用不了那麼大的棧空間。棧頂指標ss:sp指向30,也就是指向已經定義了3個16位元組的空間底部。
前面的**將所有內容都放到乙個段中,這樣做有兩個主要的問題:
1、放到乙個段中看起來很混亂
2、如果資料、棧和**需要的空間超過64kb,就不能放在乙個段中。
此時我們可以考慮設定多個段:
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,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack 段名stack就代表段位址
mov ss,ax 這裡要讓ss指向stack,因為不能直接對段暫存器賦值
注意assume宣告不代表暫存器就指向對應的段,還要手動設定
mov sp,20h 設定棧頂ss:sp指向cs:20
mov ax,data
mov ds,ax 讓ds指向data段位址
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s 將8個資料依次入棧
mov bx,0
mov cx,8
s0: pop [bx]
add bx,2
loop s0 從棧中將資料取出放到最初的位置
mov ax,4c00h
int 21h
code ends
end start
組合語言筆記06 包含多個段的程式
在作業系統的環境下,合法地通過作業系統取得的空間都是安全的。程式取得所需空間的方法有兩種 一是在引導程式的時候為程式分配,再就程式在執行過程中向系統申請。對於第一種方式,我們在程式中定義將要處理的資料,這些資料被編譯 連線程式作為程式的一部分寫入可執行檔案中。當可執行檔案的程式載入到記憶體中,這些資...
6 包含多個段的程式
1 如果程式要存放資料,要使用什麼地方,第五章講到了一塊安全的空間0 200 0 2ff是相對安全的,可這段空間的容量只有256個位元組,如果我們需要的空間超過256個位元組又該如何呢?取得空間的方法有兩種,一種是引導程式的時候為程式分配 堆疊 再就是程式執行過程中向系統申請 堆 對於第一種方法 1...
組合語言學習筆記(六)包含多個段的程式
6.1在 段中使用資料 dw 定義字型資料 define word db 定義位元組資料 define byte assume cs codesg code segment dw 0123h,0456h 偏移位址從0 2 4 6.start mov bx,0 mov ax,0 mov cx,8 s ...