實驗一 用匯編指令編碼和除錯
實驗結論
(2) 任務2
-
在debug中,使用d命令檢視生產日期
-
使用e命令修改生產時期所在的記憶體單元,修改後,再次使用d命令檢視
- 原因:地址C0000~FFFFF 為ROM地址空間,無法改寫其內容.
(3) 任務3
在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。
嘗試修改記憶體地址,或,嘗試修改記憶體的資料,再次觀察結果。
-f b800:0f20 0fdf 03 03
(4) 任務4
填空
-a mov ax, 20 mov ds, ax mov ss, ax mov sp, 30 push [0] ; 執行後,暫存器(sp) = _002e___ push [2] ; 執行後,暫存器(sp) = _002c___ push [4] ; 執行後,暫存器(sp) = _002a___ push [6] ; 執行後,暫存器(sp) = _0028___ pop [6] ; 執行後,暫存器(sp) = __002a__ pop [4] ; 執行後,暫存器(sp) = __002c__ pop[2] ; 執行後,暫存器(sp) = __002e__ pop [0] ; 執行後,暫存器(sp) = __0030__
問題1:題目要求是把00220H ~ 0022fH用作棧空間。指令 mov ss, ax 和 mov sp, 30 執行後, 棧頂的邏輯地址和實體地址分別是?
棧頂的邏輯地址是 0020:0030 , 實體地址是 00230H
問題2:單步除錯到彙編指令 push [6] 執行結束, pop [6] 執行之前,使用 d 20:20 2f 檢視此 時棧空間資料,給出實驗截圖。
問題3:彙編指令 pop [0] 執行結束後, pop [0] 指令執行結束後,使用d命令 d 20:0 7 檢視此 時資料空間內的資料是否有變化。給出實驗截圖。
問題4:如果把最後四條指令改成截圖中的順序, pop [6] 指令執行結束後,使用d命令 d 20:0 7 檢視此時資料空間內的資料是否有變化。給出實驗截圖。
(5) 任務5
問題1:使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?後面的指令 mov sp, 30 是什麼時候執行的?
不是. mov sp ,30 在 mov ss,ax 執行完後及跟著執行.
問題2:根據彙編指令,前三條指令執行後,00220H ~ 0022fH被設定為棧空間。並且,初始時,已通 過f命令將初始棧空間全部填充為0。觀察單步除錯時,棧空間00220H ~ 0022fH記憶體單元值的變化,特 別是圖示中黃色下劃線表示出的資料值。根據實驗觀察,嘗試思考和分析原因。
確定棧頂地址後,棧空間存放當前下一條要執行的指令的地址(CS:IP).
(6) 任務6
使用masm、link,彙編、連結,得到可執行檔案task5.exe。執行程式。
結合程式執行結果,理解程式 功能。 使用debug工具,除錯task5.exe。根據第4章所學知識,任何可執行程式在執行時,都有一個載入程式 負責將其載入到記憶體,並將CPU控制權移交給它,也即將CS:IP指向可執行程式中第一條機器指令。在加 載可執行程式時,可執行前面512位元組是程式段字首PSP(Program Segment Prefix),用於記錄程式一些 相關資訊。
在debug中,使用d命令,檢視task5.exe的程式段字首,觀察這256個位元組的內容,驗證前兩個位元組是 否是CD 20。
(7) 任務7
給出補全後的完整原始碼。說明程式中兩個空填寫的依據。
1 assume cs:code 2 code segment 3 mov ax, _cs____ 4 mov ds, ax 5 mov ax, 0020h 6 mov es, ax 7 mov bx, 0 8 mov cx, _17____ 9 s: mov al, [bx] 10 mov es:[bx], al 11 inc bx 12 loop s 13 mov ax, 4c00h 14 int 21h 15 code ends 16 end
將程式的程式碼段地址賦值給資料段地址.
CX 暫存器在迴圈指令和重複字首中,作迴圈次數計數器。先執行一次程式,然後得到迴圈指令的下一地址 17H.
在debug中除錯,使用g命令將程式執行到 loop s 之後、 mov ax, 4c00h 之前,然後,使用u命 令對0:200開始的記憶體單元反彙編,確認是否把task7.asm中line3-line12的程式碼複製到了目標記憶體 空間。 給出使用g命令執行到指定點和使用u命令反彙編0:200到複製程式碼長度這一段記憶體空間的截圖。