實驗 3 程式設計,編譯,連線,跟蹤
一、實驗目的
1. 掌握組合語言源程式(8086 dos 彙編)編寫→彙編→連結→除錯的方法
2. 加深對 1-4 章基礎知識的理解
二、實驗準備
1. 結合第 4 章課件和教材,學習/複習完整彙編源程式編寫→彙編→連線→執行→除錯 的方法
2. 複習第 1-3 章以下基礎知識:
(1)暫存器用法
① 通用暫存器 AX, BX,CX, DX
② 段暫存器 CS, DS, SS 和兩個特殊暫存器 IP, SP
(2)記憶體訪問,特別是多位元組資料的存、取
(3)彙編指令用法,注意其合法使用形式
① 資料傳送類指令:mov, push, pop
② 算術運算指令:add, sub
③ 轉移類指令:jmp
三、實驗內容
1. 練習 1
(1)編寫彙編源程式 t1.asm
為了方便後續操作,選擇在masm.exe,link.exe同文件夾下用notepad編寫該彙編程式,將檔案字尾名更改為.asm
(2)對源程式 t1.asm 進行彙編、連線、執行、除錯 (1) 執行程式,觀察程式輸出結果是什麼
(顯然我們需要使用DS Box來完成此次實驗,實驗前依然需要掛載,這個操作在第一次實驗時就有過,
此次步驟就省去不表示。)
為了避免在編譯,連線過程中產生一些中間檔案的過程,這裡在語句後面加一個分號
可以看出執行結果是輸出了36
(3) 將 line4 和 line9 種暫存器 dl 的值分別修改為 0~9 中任何一個數字,重新彙編→ 連線→執行,觀察結果的變化。
隨機的修改數字
儘管在語句後加分號省去了生成編譯,連線中間檔案的過程,但這些相同的步驟依然很麻煩,可以省去
在notepad中寫入如下程式碼,命名為process,字尾改為.bat
在這裡發現編譯,連線,執行的過程都已經省去,只需要輸入process t1
在分別修改了數字後發現輸出結果改變了,儘管這段程式碼還不太理解,但可以大致知道,這兩行
應該是決定了輸出的結果
(4) 用 debug 對生成的可執行檔案 t1.exe 進行除錯。
① 使用 r 命令檢視。觀察暫存器 cx 的值是 多少;觀察暫存器 ds 和 cs 的值是多 少,它們之間是否滿足關係(cs)=(ds)+10H
暫存器CX的值是16,表明這段程式碼的機器碼長度是16。
DS=075a,CS=076a。必然的兩者相差10h,即滿足(cs)=(ds)+10H,
也就是說PSP區:075a:0,程式區:076a:0
② PSP(程式段字首)的頭兩個位元組是 CD 20, 用 debug 檢視 PSP 的內容,驗證是否 如此。
使用d命令檢視075a(即DS暫存器)開始的記憶體中的內容,顯然前十個長度的記憶體內容為PSP區內容,確實頭兩個位元組為CD 20
③ 使用 u 命令對 t1.exe 進行反彙編,觀察反彙編得到的原始碼。
程式入口地址CS:IP=076a:0,而CX=16表示的是程式機器碼長度,所以在反彙編時可以準確反彙編出程式段內容
④ 使用 t 命令和 p 命令(遇到 int 命令時,用 p 命令)單步除錯,觀察結果。
這裡沒有什麼異常,程式按順序步驟執行,遇到int用p指令,最終正常終止
這裡除了CS:IP的值發生了改變,AX,BX暫存器的值也發生了改變。
2. 練習 2
(1)編寫彙編源程式 t2.asm
為了方便後續操作,選擇在masm.exe,link.exe同文件夾下用notepad編寫該彙編程式,將檔案字尾名更改為.asm
(2)對源程式 t2.asm 進行彙編、連線、執行、除錯
(3) 對 t2.asm 進行彙編、連線後,得到可執行檔案 t2.exe。執行 t2.exe,觀察程式執行 結果,驗證是否在螢幕左上方出現紅色的數值 36。
注*)經測試,有些平臺在 dosbox 下執行這個程式時有些問題,如果螢幕左上方沒有 輸出結果,請執行程式 t2.exe 前,先輸入 cls 命令清空一下螢幕,然後再執行 t2.exe。
在使用process.bat一次性編譯,連線,執行後發現並沒有出現預期的紅色36
在清屏終於出現了預期的結果,在螢幕左上方出現了紅色的36
(4) 如果(1)結果得到驗證,重新開啟 t2.asm,嘗試將原始碼中 line7 的 0433h→0432h, line10 的 0436h→0439h, 然後重新彙編、連線,得到可執行檔案 t2.exe。使用 cls 命令清 屏後,再次觀察程式執行結果。
在修改後再次執行,發現在左上方仍然出現了紅色的36
(5) 如果(1)結果得到驗證,重新開啟 t2.asm,嘗試將原始碼中 line7 的 0433h→0333h, line10 的 0436h→0336h, 然後重新彙編、連線,得到可執行檔案 t2.exe。使用 cls 命令清 屏後,再次觀察程式執行結果。
此次在左上方出現了藍色的36
四、總結與體會
1.在之前的實驗中由於只是在學習操作記憶Debug的各種命令,感覺很枯燥;
但在這次實驗後發現Debug除錯在彙編程式的查錯過程中很有幫助
2.任何重複的機械的操作都可以化繁為簡,我們減少不必要無意義的操作。
3.一個簡單的彙編程式實現起來並不容易,組合語言寫程式和高階語言有很大區別
,但也有相似的地方。
4.我們學習組合語言是為了直接控制重重覆蓋的作業系統軟體下的硬體