彙編06 包含多個段的程式

2022-08-19 15:06:09 字數 2398 閱讀 4591

在執行匯程式設計序的時候,不要隨便向某個暫存器中賦值,這可能會導致系統錯誤,雖然現在的作業系統已經完全把硬體保護起來了,但是在安全模式下還是可以執行導致系統崩潰的命令。所以我們在編寫匯程式設計序的時候,要找到一段安全的空間供我們使用,在一般的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 ...