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

實驗 1 8086 彙編指令編碼和除錯

實驗結論

2.實驗任務2

PC機主機板上的ROM中有一個生產時期,在記憶體FFF00H ~ FFFFFH的某幾個單元中,請找到這個生產時期,並試圖修改它。
  • 使用d命令檢視生產時期,實驗結果如圖1所示。

圖1 使用d命令檢視

  • 使用e命令修改生產時期所在的記憶體單元,修改後,再次使用d命令檢視,實驗結果如圖2所示。

圖2 修改生產日期所在記憶體單元

  • 使用d命令檢視,如圖3所示。

圖3 修改生產日期後的效果圖

結論:無法修改生產時期所在的記憶體單元。

原因:記憶體FFF00H ~ FFFFFH屬於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。
  • 在debug中使用e命令修改記憶體單元,效果如圖4所示。

圖4 修改記憶體單元

  • 在debug中使用f命令批量填充記憶體單元,效果如圖5所示。

圖5 批量填充記憶體單元

  • 嘗試修改記憶體單元,效果如圖6所示。

圖6 修改記憶體單元后


4.實驗任務4

已知記憶體單元00201H ~ 00207H分別存放資料(如下圖所示),00220H ~ 0022fH用作棧空間 在debug環境中,按順序錄入以下內容,單步跟蹤除錯,觀察暫存器和記憶體空間00200H~00207H,以及,棧空間00220 ~ 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 檢視此時資料空間內的資料是否有變化。
  • 填空
 1 -a
 2 mov ax, 20 
 3 mov ds, ax 
 4 mov ss, ax 
 5 mov sp, 30 
 6 push [0] ; 執行後,暫存器(sp) = 2E
 7 push [2] ; 執行後,暫存器(sp) = 2C
 8 push [4] ; 執行後,暫存器(sp) = 2A
 9 push [6] ; 執行後,暫存器(sp) = 28
10 pop  [6] ; 執行後,暫存器(sp) = 2A
11 pop  [4] ; 執行後,暫存器(sp) = 2C
12 pop  [2] ; 執行後,暫存器(sp) = 2E
13 pop  [0] ; 執行後,暫存器(sp) = 30
  • 回答問題

1.題目要求是把00220H ~ 0022fH用作棧空間。指令 mov ss, ax 和 mov sp, 30 執行後,棧頂的邏輯地址和實體地址分別是?

     棧頂的邏輯地址是0020:30,實體地址為00230H。

2.單步除錯到彙編指令 push [6] 執行結束, pop [6] 執行之前,使用 d 20:20 2f 檢視此時棧空間資料。給出實驗截圖。 結果如圖7所示。

圖7 push[6]結束,pop[6]未開始時,棧空間資料

3. pop [0] 指令執行結束後,使用d命令 d 20:0 7 檢視此時資料空間內的資料是否有變化。給出實驗截圖。

     無變化,實驗結果如圖8所示。

圖8 pop[0]結束,資料空間內的資料

4.如果把最後四條指令改成截圖中的順序, pop [6] 指令執行結束後,使用d命令 d 20:0 7檢視此時資料空間內的資料是否有變化。給出實驗截圖。

     資料發生了變化,實驗結果如圖9所示。

圖9 指令順序改變


5.實驗任務5

在debug環境中,實踐以下內容。 先使用f命令,把00220H ~ 0022fH區間的16個位元組記憶體單元值全部修改為0。並使用d命令檢視確認。 然後,使用a命令、r命令、t命令寫入彙編指令並單步除錯。
  • 使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?後面的指令 movsp, 30 是什麼時候執行的?

   單步執行完mov ss, ax指令後未暫停,不響應debug發出的中斷請求,繼續執行下一步mov sp, 30指令。

  • 根據彙編指令,前三條指令執行後,00220H ~ 0022fH被設定為棧空間。並且,初始時,已通過f命令將初始棧空間全部填充為0。觀察單步除錯時,棧空間00220H ~ 0022fH記憶體單元值的變化,特別是圖示中黃色下劃線表示出的資料值。根據實驗觀察,嘗試思考和分析原因。

   08 01為偏移地址,3F 07是程式段地址。因為程式需要中斷,需要響應程式執行地址,恢復執行。


6.實驗任務6

使用任何一款文字編輯器,編寫8086彙編程式原始碼task6.asm 使用masm、link,彙編、連結,得到可執行檔案task5.exe。執行程式。結合程式執行結果,理解程式功能。 使用debug工具,除錯task5.exe。根據第4章所學知識,任何可執行程式在執行時,都有一個載入程式負責將其載入到記憶體,並將CPU控制權移交給它,也即將CS:IP指向可執行程式中第一條機器指令。在載入可執行程式時,可執行前面512位元組是程式段字首PSP(Program Segment Prefix),用於記錄程式一些相關資訊。

在debug中,使用d命令,檢視task5.exe的程式段字首,觀察這256個位元組的內容,驗證前兩個位元組是否是CD 20。
  • 給出程式原始碼

  task6.asm

 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對程式彙編連結過程分別如圖10、11所示。

圖10 masm命令

圖11 link命令

   執行可執行程式task5.exe結果如圖12所示。

圖12 task5.exe執行結果

  • 給出在debug中檢視task5.exe的程式段字首PSP的截圖。

   前兩個位元組為CD 20,如圖13所示。

圖13 task5.exe程式段字首PSP


7.實驗任務7

下面程式的功能是,完成自身程式碼的自我複製:把 mov ax, 4c00h 之前的指令複製到記憶體0:200開始的連續的記憶體單元。 補全程式,並在debug中除錯驗證,確認是否正確實現了複製要求。 task7.asm
assume cs:code 
code segment 
        mov ax, _____ 
        mov ds, ax 
        mov ax, 0020h 
        mov es, ax 
        mov bx, 0 
        mov cx, _____ 
s:     mov al, [bx] 
        mov es:[bx], al 
        inc bx 
        loop s 

        mov ax, 4c00h 
        int 21h 
code ends
end
(1) 補全程式。說明這樣填寫的依據。 (2) 在debug中除錯,使用g命令將程式執行到 loop s 之後、 mov ax, 4c00h 之前,然後,使用u命令對0:200h開始的記憶體單元反彙編,確認是否把task7.asm中line3-line12的程式碼複製到了目標記憶體空間。
  • 給出補全後的完整原始碼。說明程式中兩個空填寫的依據。
 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

   需要將程式段開始地址賦值給ds,即ax與cs一致,所以位cs。

   應填入需要複製的程式的長度

  • 在debug中除錯,使用g命令將程式執行到 loop s 之後、 mov ax, 4c00h 之前,然後,使用u命令對0:200開始的記憶體單元反彙編,確認是否把task7.asm中line3-line12的程式碼複製到了目標記憶體空間。
   給出使用g命令執行到指定點和使用u命令反彙編0:200到複製程式碼長度這一段記憶體空間的截圖。    如圖14所示。

圖14