8086 彙編學習 Part 3

AlwaysBeShine發表於2024-04-07

組合語言程式

用匯編語言編寫程式的工作過程

彙編指令對應有機器碼的指令,可以被編譯為機器指令,最終被 CPU 執行。
偽指令是沒有對應的機器碼的指令,最終不被 CPU 所執行。
偽指令由編譯器來執行,編譯器根據偽指令來進行相關的編譯工作。
彙編程式是包含彙編指令和偽指令的文字。
程式返回是程式結束執行後,將 CPU 的控制權交還給它得以執行的程式(常為DOS系統)

偽指令的種類

段定義

  • 一個彙編程式是由多個段組成的,這些段被用來存放程式碼和資料或當作棧空間來使用
  • 一個有意義的彙編程式至少要有一個段,這個段用來存放程式碼。
  • 定義程式中的段,每個段都需要有段名
  段名 segment ;段的開始
  段名 ends ;段的結束

END

彙編程式的結束標記。若程式結尾處不加 end ,編譯器在編譯程式時,無法知道程式在何處結束。

ASSUME (假設)

含義是假設某一段暫存器和程式中的某一個用 SEGMENT ... ENDS 定義的段相關聯
ASSUME CS:CODESG 指 CS 暫存器與 CODESG 關聯,將定義的 CODESG 當作程式的程式碼段使用。

源程式編譯

源程式檔案經過工具軟體編譯連線後,生成可執行檔案包含指令機器碼和描述程式有關整體特徵的資料。

彙編程式的結構

  1. 在 Debug 中直接寫入指令編寫的彙編程式
    • 適用於功能簡單、短小精悍的程式
    • 只需要包含彙編指令即可
  2. 單獨編寫成原始檔後再編譯為可執行檔案的程式
    • 適用於編寫大程式
    • 需要包括彙編指令,還要有指導編譯器工作的偽指令
    • 原始檔由一些段構成,這些段存放程式碼、資料,或將某個段作為棧空間

從源程式到可執行檔案

  1. 文字編輯源程式檔案 (.asm)
  2. 編譯生成目標檔案(.obj) 目標檔案是我們對一個源程式進行編譯要得到的最終結果,此過程也會生成列表檔案(.lst)和交叉引用檔案(.crf)
  3. 連線形成包含相關的描述資訊和二進位制程式碼的可執行檔案(.exe)

使用 Debug 跟蹤程式的執行

程式載入後,DS 中存放著程式所在記憶體區的段地址,這個記憶體區的偏移地址為 0,則程式所在的記憶體區的地址為 DS:0。
這個記憶體區的前 256 個位元組存程式段字首 PSP 作為資料區,DOS 用來和程式進行通訊,從 256 位元組處向後的空間存放的是程式。
程式碼段暫存器 CS 的值為 \(DS+10H\),CX 中存放程式碼的長度(位元組)

繼續命令P(proceed)

類似於 T 命令,逐條執行指令、顯示結果。但遇到子程式、中斷等時,直接執行,然後顯示結果

執行命令G(Go)

從指令地址處開始執行程式,直到遇到斷點或者程式正常結束。

程式執行的不同方式

DOS 中執行

  1. DOS 啟動後,計算機由“命令直譯器”(程式 command.com)控制
  2. 執行可執行程式時,command 將程式載入入記憶體,設定 CPU 的 CS:IP 指向程式的第一條指令(即程式的入口),使程式得以執行。
  3. 程式執行結束後,返回到“命令直譯器”, CPU 繼續執行 command。

在 Debug 中執行

執行 Debug 時,command 程式載入 Debug.exe,debug 將程式載入入記憶體,程式執行結束後要返回到 Debug 中,使用 Q 命令推出 Debug,將返回到 command 中。

[] 和 ()

彙編語法規定 [] 表示一個記憶體單元,預設在 DS 中,偏移地址是 [] 中所包含的內容所代表的值。
約定 () 表示一個記憶體單元或暫存器中的內容,不能使用 "(段地址:偏移地址)" 的格式。
例如:\((ax) = 0010H (21000H) = 0010H\)

常量

約定符號 idata 表示常量

相關文章