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

實驗一 用匯編指令編碼和除錯

實驗結論

(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到複製程式碼長度這一段記憶體空間的截圖。