今天我們來看看第六章。
我們知道在高階語言中,有陣列這樣東西。
那麼在組合語言中,我們又如何將一段資料儲存在一段連續的記憶體中呢?
我們肯定不能隨便找到一段記憶體,然後就往裡面存,因為那樣可能會覆蓋那裡原有的非常重要的東西。所以我們應當讓系統為我們分配。
這裡就又涉及到乙個語句:
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暫存器中,用迴圈累加的方式 想用迴圈,就需要把這些資料儲存在一組位址連續的記憶體單元中,之前提到過應該讓系統來分配空間,因此我們在程式中定義希望處理的資料,這些資料最終會成為程式的一部分寫到可執行檔案中,可執行檔案載入到記憶體中後,這些...