組合語言程式
用匯編語言編寫程式的工作過程
彙編指令對應有機器碼的指令,可以被編譯為機器指令,最終被 CPU 執行。
偽指令是沒有對應的機器碼的指令,最終不被 CPU 所執行。
偽指令由編譯器來執行,編譯器根據偽指令來進行相關的編譯工作。
彙編程式是包含彙編指令和偽指令的文字。
程式返回是程式結束執行後,將 CPU 的控制權交還給它得以執行的程式(常為DOS系統)
偽指令的種類
段定義
- 一個彙編程式是由多個段組成的,這些段被用來存放程式碼和資料或當作棧空間來使用
- 一個有意義的彙編程式至少要有一個段,這個段用來存放程式碼。
- 定義程式中的段,每個段都需要有段名
段名 segment ;段的開始
段名 ends ;段的結束
END
彙編程式的結束標記。若程式結尾處不加 end ,編譯器在編譯程式時,無法知道程式在何處結束。
ASSUME (假設)
含義是假設某一段暫存器和程式中的某一個用 SEGMENT ... ENDS
定義的段相關聯
ASSUME CS:CODESG
指 CS 暫存器與 CODESG 關聯,將定義的 CODESG 當作程式的程式碼段使用。
源程式編譯
源程式檔案經過工具軟體編譯連線後,生成可執行檔案包含指令機器碼和描述程式有關整體特徵的資料。
彙編程式的結構
- 在 Debug 中直接寫入指令編寫的彙編程式
- 適用於功能簡單、短小精悍的程式
- 只需要包含彙編指令即可
- 單獨編寫成原始檔後再編譯為可執行檔案的程式
- 適用於編寫大程式
- 需要包括彙編指令,還要有指導編譯器工作的偽指令
- 原始檔由一些段構成,這些段存放程式碼、資料,或將某個段作為棧空間
從源程式到可執行檔案
- 文字編輯源程式檔案 (.asm)
- 編譯生成目標檔案(.obj) 目標檔案是我們對一個源程式進行編譯要得到的最終結果,此過程也會生成列表檔案(.lst)和交叉引用檔案(.crf)
- 連線形成包含相關的描述資訊和二進位制程式碼的可執行檔案(.exe)
使用 Debug 跟蹤程式的執行
程式載入後,DS 中存放著程式所在記憶體區的段地址,這個記憶體區的偏移地址為 0,則程式所在的記憶體區的地址為 DS:0。
這個記憶體區的前 256 個位元組存程式段字首 PSP 作為資料區,DOS 用來和程式進行通訊,從 256 位元組處向後的空間存放的是程式。
程式碼段暫存器 CS 的值為 \(DS+10H\),CX 中存放程式碼的長度(位元組)
繼續命令P(proceed)
類似於 T 命令,逐條執行指令、顯示結果。但遇到子程式、中斷等時,直接執行,然後顯示結果
執行命令G(Go)
從指令地址處開始執行程式,直到遇到斷點或者程式正常結束。
程式執行的不同方式
DOS 中執行
- DOS 啟動後,計算機由“命令直譯器”(程式 command.com)控制
- 執行可執行程式時,command 將程式載入入記憶體,設定 CPU 的 CS:IP 指向程式的第一條指令(即程式的入口),使程式得以執行。
- 程式執行結束後,返回到“命令直譯器”, CPU 繼續執行 command。
在 Debug 中執行
執行 Debug 時,command 程式載入 Debug.exe,debug 將程式載入入記憶體,程式執行結束後要返回到 Debug 中,使用 Q 命令推出 Debug,將返回到 command 中。
[] 和 ()
彙編語法規定 [] 表示一個記憶體單元,預設在 DS 中,偏移地址是 [] 中所包含的內容所代表的值。
約定 () 表示一個記憶體單元或暫存器中的內容,不能使用 "(段地址:偏移地址)" 的格式。
例如:\((ax) = 0010H (21000H) = 0010H\)
常量
約定符號 idata 表示常量