實驗一 彙編指令編碼和除錯
一、實驗結論
1. 實驗任務2
PC機主機板上的ROM中有一個生產時期,在記憶體FFF00H ~ FFFFFH的某幾個單元中,請找到這個生產時期,並試圖修改它。
- 給出使用d命令檢視生產時期的截圖
- 給出使用e命令修改生產日期所在記憶體單元的截圖,以及,修改後,再次使用d命令檢視的截圖
結論:不能修改。因為向地址C0000~FFFFF的記憶體單元寫入資料的操作是無效的,因為這個單元是各類ROM地址空間,等於改寫只讀儲存器的內容。所以,該單元不發生改變。
2.實驗任務3
- 給出在debug中使用e命令修改記憶體單元的命令,效果截圖
-e b800:0 03 04 03 04 03 04 03 04 03 04
- 給出在debug中使用f命令批量填充記憶體單元的命令,及效果截圖
-f b800:0f00 0f9f 03 04
- 嘗試修改記憶體單元,或,資料後的效果截圖
3.實驗任務4
根據在debug環境中除錯觀察結果,填空並回答問題。
- 填空
1 -a
2 mov ax, 20
3 mov ds, ax
4 mov ss, ax
5 mov sp, 30
6 push [0] ; 執行後,暫存器(sp) = 002E
7 push [2] ; 執行後,暫存器(sp) = 002C
8 push [4] ; 執行後,暫存器(sp) = 002A
9 push [6] ; 執行後,暫存器(sp) = 0028
10 pop [6] ; 執行後,暫存器(sp) = 002A
11 pop [4] ; 執行後,暫存器(sp) = 002C
12 pop [2] ; 執行後,暫存器(sp) = 002E
13 pop [0] ; 執行後,暫存器(sp) = 0030
- 回答問題
問題1:題目要求是把00220H ~ 0022fH用作棧空間。指令 mov ss, ax 和 mov sp, 30 執行後,棧頂的邏輯地址和實體地址分別是?
邏輯地址為0020:0030H,實體地址為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:07 檢視此時資料空間內的資料是否有變化。給出實驗截圖。
結論:此時資料空間內的資料順序發生變化。
4.實驗任務5
問題1:使用t命令單步執行 mov ss, ax 時,單步執行完這一條指令就暫停了嗎?後面的指令 mov sp, 30 是什麼時候執行的?
答:沒有暫停。指令 mov sp, 30 是在mov ss,ax後執行的,兩條命令是在一條t命令中執行。
問題2:根據彙編指令,前三條指令執行後,00220H ~ 0022fH被設定為棧空間。並且,初始時,已通 過f命令將初始棧空間全部填充為0。觀察單步除錯時,棧空間00220H ~ 0022fH記憶體單元值的變化,特別是圖示中黃色下劃線表示出的資料值。根據實驗觀察,嘗試思考和分析原因。
答:debug使用t命令單步執行,引發中斷造成的。中斷過程中,使用棧空間存放CPU關鍵資料。圖示中黃色下劃線表示出的資料值是下一條指令的記憶體地址。
5.實驗任務6
- 給出程式原始碼
1 assume cs:code
2
3 code segment
4 start:
5 mov cx,10
6 mov dl,'0'
7 s: mov ah,2
8 int 21h
9 add dl,1
10 loop s
11
12 mov ah,4ch
13 int 21h
14 code ends
15 end start
- 給出使用masm、link對程式彙編連結過程截圖,以及,執行可執行程式task5.exe的執行結果截圖
masm:
link:
執行:
- 給出在debug中檢視task5.exe的程式段字首PSP的截圖。
前兩個位元組是CD 20
6.實驗任務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,17h
9 s: mov al,[bx]
10 mov es:[bx],al
11 inc bx
12 loop s
13
14 mov ax,4c00h
15 int 21h
16 code ends
17 end
第一空 cs:cs為程式碼段暫存器,將cs值通過ax賦值給ds,為了實現從程式碼段第一行開始複製。
第二空 17h:通過debug -u命令得知,3-12行所佔的偏移地址範圍從0000-0016,所以要複製17次,迴圈次數為17。
- 在debug中除錯,使用g命令將程式執行到 loop s 之後、 mov ax, 4c00h 之前,然後,使用u命 令對0:200開始的記憶體單元反彙編,確認是否把task7.asm中line3-line12的程式碼複製到了目標記憶體空間。給出使用g命令執行到指定點和使用u命令反彙編0:200到複製程式碼長度這一段記憶體空間的截圖。
二、實驗總結
- 棧總是先進後出,棧的最大空間為 64K。由於 "棧" 是由高到低使用的,所以新壓入的資料的位置更低,ESP 中的指標將一直指向這個新位置,所以 ESP 中的地址資料是動態的。
- PUSH 指令首先減少 ESP 的值,再將源運算元複製到堆疊。運算元是 16 位的,則 ESP 減 2,運算元是 32 位的,則 ESP 減 4。
- POP 指令首先把 ESP 指向的堆疊元素內容複製到一個 16 位或 32 位目的運算元中,再增加 ESP 的值。如果運算元是 16 位的,ESP 加 2,如果運算元是 32 位的,ESP 加 4。