實驗一 8086彙編指令和除錯
實驗結論
實驗二
PC機主機板上的ROM中有一個生產時期,在記憶體FFF00H ~ FFFFFH的某幾個單元中,請找到這個生產時
期,並試圖修改它。
可見時間為1992年1月1日
用e命令修改,發現無法修改
實驗三
在debug中,使用e命令,向記憶體單元填寫資料。
-e b800:0 03 04 03 04 03 04 03 04 03 04 從b800:0開始的記憶體單元開始,依次寫入十六進位制資料04 03,重複寫5次。
在debug中,使用f命令,向記憶體單元批量填寫資料。
-f b800:0f00 0f9f 03 04
把記憶體單元區間b800:0f00 ~ b800:0f9f連續160個位元組,依次重複填充十六進位制資料03 04。
再次修改
實驗四
已知記憶體單元00201H ~ 00207H分別存放資料(如下圖所示),00220H ~ 0022fH用作棧空間
(1) 單步執行,在執行push指令和pop指令時,觀察並記錄棧頂偏移地址的暫存器sp值的變化情況。
(2) push [6] 指令執行結束後, pop [6] 指令執行結束前,使用d命令 d 20:20 2f 檢視此時棧空間的
資料。
(3) pop [0] 指令執行結束後,使用d命令 d 20:0 7 檢視此時資料空間內的資料是否有變化。
(4) 如果把最後四條指令改成截圖中的順序, pop [6] 指令執行結束後,使用d命令 d 20:0 7 檢視此時
資料空間內的資料是否有變化。
實驗任務五
先使用f命令,把00220H ~ 0022fH區間的16個位元組記憶體單元值全部修改為0。並使用d命令檢視確認。
然後,使用a命令、r命令、t命令寫入彙編指令並單步除錯。
觀察並思考:
問題1:使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?後面的指令 mov sp, 30 是什麼時候執行的?
Ans: 並沒有暫行,同時執行了之後的指令mov sp, 30。
問題2:根據彙編指令,前三條指令執行後,00220H ~ 0022fH被設定為棧空間。並且,初始時,已通
過f命令將初始棧空間全部填充為0。觀察單步除錯時,棧空間00220H ~ 0022fH記憶體單元值的變化,特
別是圖示中黃色下劃線表示出的資料值。根據實驗觀察,嘗試思考和分析原因
原因分析:黃色下劃線標出資料為下一條指令的地址。由於在debug中使用t命令單步除錯導致中斷,cpu在該空間存放關鍵資料,導致修改了棧內的資料。
實驗六
使用masm、link,彙編、連結,得到可執行檔案task5.exe。執行程式。結合程式執行結果,理解程式
功能。
執行得到結果
使用debug工具,除錯task5.exe。根據第4章所學知識,任何可執行程式在執行時,都有一個載入程式
負責將其載入到記憶體,並將CPU控制權移交給它,也即將CS:IP指向可執行程式中第一條機器指令。在加
載可執行程式時,可執行前面512位元組是程式段字首PSP(Program Segment Prefix),用於記錄程式一些
相關資訊。
在debug中,使用d命令,檢視task5.exe的程式段字首,觀察這256個位元組的內容,驗證前兩個位元組是
否是CD 20。
實驗七
下面程式的功能是,完成自身程式碼的自我複製:把 mov ax, 4c00h 之前的指令複製到記憶體0:200開始的
連續的記憶體單元。
補全程式,並在debug中除錯驗證,確認是否正確實現了複製要求。
(1) 補全程式。說明這樣填寫的依據。
第一空:cs 指向程式碼起始位置
第二空:17h 共需要複製了位元組為23位元組。
(2) 在debug中除錯,使用g命令將程式執行到 loop s 之後、 mov ax, 4c00h 之前,然後,使用u命令
對0:200h開始的記憶體單元反彙編,確認是否把task7.asm中line3-line12的程式碼複製到了目標記憶體空間。
實驗總結
1.編寫彙編程式不像編寫其他編寫高階程式語言的程式,不那麼直觀,在編寫程式的時候需要特別小心。
2.熟練掌握debug的各種命令可以使彙編程式的程式設計變得更加容易,可以更快的定位到錯誤,也能更好的瞭解記憶體的分佈。