1. 程式人生 > 其它 >實驗一 彙編指令編碼和除錯

實驗一 彙編指令編碼和除錯

一、實驗結論

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。