組合語言第六章 包含多個段的程式

2021-09-29 13:38:40 字數 1844 閱讀 9641

今天我們來看看第六章。

我們知道在高階語言中,有陣列這樣東西。

那麼在組合語言中,我們又如何將一段資料儲存在一段連續的記憶體中呢?

我們肯定不能隨便找到一段記憶體,然後就往裡面存,因為那樣可能會覆蓋那裡原有的非常重要的東西。所以我們應當讓系統為我們分配。

這裡就又涉及到乙個語句:

dw 0123,2312,34a3,1231,3456
這裡dw是「define word」 的意思,即定義字型資料。

那麼我們的這段資料存在**了呢?

這要看這條語句的位置。如果它位於**段,那麼就是從cs指向的位址開始。

但是這麼一來,我們的cpu 怎麼知道這一段不是**呢?

這裡我們就又要用到乙個偽指令,我們這樣做:

assume cs:cgg

cgg segment

dw 0123,2312,34a3,1231,3456

start: mov bx,0

mov ax,0

mov cx,8

s: add ax,cs:[bx]

add bx,2

loop s

mov ax,4c00h

int 21h

code ends

endstart

我們知道程式的末尾的end表示結束。

而這裡end start則是在提示,我的語句從start那個地方開始。

所以電腦就會知道要從start處開始執行。

我們之前提到了棧,那麼我們應該怎麼在**段中使用棧呢?

其實很簡單,我們只需要用dw開闢一段記憶體就好了。

如:

dw 0,0,0,0,0,0,0,0,0
接下來我們只需要將ss:sp調整到位,就可以使用了。

為什麼要放到不同的段?

有兩個原因:

放在同乙個段中我們需要自己小心,否則讀錯了會導致問題,而且本身也很混亂

我們學習的是8086模式,它的段空間只有64k,那麼當我們的程式變得龐大時,這點空間是不夠我們使用的

出於這兩點,我們需要進行一些改變。

我們先展示一段**,然後再依據這個來講解:

assume cs:code,ds:data,ss:stack

data segment

dw 1234h,2345h,2343h,2345h

data ends

stack segment

dw 0,0,0,0,0,0,0

stack ends

code segment

start: mov ax,data

mov ds,ax

mov ax,stack

mov ss,ax

mov ax,4c00h

int 21h

code ends

end start

你的第一反應可能是,我們只要定義多個段,然後用assume把他們和對應的暫存器關聯就好了。

但事情並不像我們想的這樣簡單。

事實上,assume是乙個偽指令,它是寫給編譯器看的,而cpu並不會得到它。

那麼我們乙個怎麼實現這樣的操作呢?

注意我們寫的**:

mov ax,data

mov ds,ax

mov ax,stack

mov ss,ax

這裡就是把對應的短段位址傳給了cpu。

注意,這裡的data和stack相當於常量,不能直接賦值給ds或ss

至於怎麼識別**段,這個前面已經說過,不在贅述。

這就是我們的第六章。

第六章 包含多個段的程式

一 在 段中使用資料。dw,作用為定義字型資料。dw define word。dw定義時資料之間以逗號分隔。eg dw 0123h,0456h,0789h 程式6.1 反彙編 g命令執行 執行出現錯誤。從0770 0010開始才是需要的機器碼,資料被執行成了機器碼。兩個方法解決 法一 將ip值設為1...

第六章 包含多個段的程式 知識梳理

1.在 段中使用資料 dw的含義是定義字型資料 define word 注意 db定義位元組型別變數,乙個位元組資料佔1個位元組單元,讀完乙個,偏移量加1 dw定義字型別變數,乙個字資料佔2個位元組單元,讀完乙個,偏移量加2 dd定義雙字型別變數,乙個雙字資料佔4個位元組單元,讀完乙個,偏移量加4程...

組合語言(王爽)第六章

6.1 在 段中使用資料 程式設計以下8個資料的和,結果存在ax暫存器中,用迴圈累加的方式 想用迴圈,就需要把這些資料儲存在一組位址連續的記憶體單元中,之前提到過應該讓系統來分配空間,因此我們在程式中定義希望處理的資料,這些資料最終會成為程式的一部分寫到可執行檔案中,可執行檔案載入到記憶體中後,這些...