實驗1 8086匯編指令編碼和調試


 

 

Debug使用

常用的幾個命令

1.用Debug的R命令查看、改變CPU寄存器的內容

2.用Debug的D命令查看內存中的內容

3.用Debug的E命令改寫內存中的內容

4.用Debug的U命令將內存中的機器指令翻譯成匯編指令

5.用Debug的T命令執行一條機器指令

6.用Debug的A命令以匯編指令的形式在內存中寫入一條機器指令

7.用Debug的P命令指定執行到指令的位置

 

任務二

查看PC機主板上的ROM中的生產日期,存放位置位於內存FFF00H~FFFFFH

 

 

 

修改生產日期,能夠執行,但無法修改,該段內容在內存中為只讀:

C0000~FFFFF內存單元為各類ROM地址空間,無法寫入數據

 

 

 

 

任務三

在debug中,使用e命令,向內存單元填寫數據。

-e b800:0 03 04 03 04 03 04 03 04 03 04

 

使用-f批量寫入數據

-f b800:0f00 0f9f 03 04

 修改寫入數據為01 02:

 修改寫入數據的地址:

 

 A0000~BFFFF的內存單元為顯存地址空間,寫入其中的數據會被顯示卡輸出到顯示器上,顯存空間地址:

A0000h - AFFFFh是圖形模式(Graphic Mode)的顯存
B0000h - B7FFFh是黑白文字模式(Mono Text Mode)的顯存
B8000h - BFFFFh是彩色文字模式的顯存

 

任務四

已知內存單元00201H~00207H中數據如下,用作棧空間:

 

 輸入以下命令進行單步跟蹤:

 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 執行后, 棧頂的邏輯地址和物理地址分別是?

棧頂邏輯地址為20h:30h,物理地址為230h

問題2:單步調試到匯編指令 push [6] 執行結束, pop [6] 執行之前,使用 d 20:20 2f 查看此 時棧空間數據,給出實驗截圖

 

 

 

 問題3:匯編指令 pop [0] 指令執行結束后,使用d命令 d 20:0 7 查看此 時數據空間內的數據是否有變化。給出實驗截圖

 

 

問題4:如果把最后四條指令改成截圖中的順序, pop [6] 指令執行結束后,使用d命令 d 20:0 7 查看此時數據空間內的數據是否有變化。給出實驗截圖

 

 

 

 

任務五

在debug環境中,實踐以下內容

 

 

問題1:使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?后面的指令 mov sp, 30 是什么時候執行的?  

t命令執行完 mov ss,ax 后,同時執行了指令 mov sp,30,所有對ss寄存器進行值修改的指令執行后,都緊接着執行其下一行指令的修改(一般情況下下一條指令是對SP的修改),這是為了確保對ss段寄存器和棧指針的修改不被破壞

 

 問題2:根據匯編指令,前三條指令執行后,00220H ~ 0022fH被設置為棧空間。並且,初始時,已通 過f命令將初始棧空間全部填充為0。觀察單步調試時,棧空間00220H ~ 0022fH內存單元值的變化,特 別是圖示中黃色下划線表示出的數據值。根據實驗觀察,嘗試思考和分析原因。

圖中的073F對應cs寄存器內的值,0180對應ip寄存器內的值,繼續執行接下來幾條指令可以發現同一現象。因此可以推斷出:棧空間內存單元值發生變化的原因是在用t指令執行命令時會產生中斷,cpu為了保護現場,會先將IP、CS兩個寄存器的值入棧。

 

 

 

任務六

使用masm、link,匯編、鏈接,得到可執行文件task5.exe。運行程序。結合程序運行結果,理解程序功能。

在debug中,使用d命令,查看task6.exe的程序段前綴,觀察這256個字節的內容,驗證前兩個字節是否是CD 20

 1 assume cs:code
 2 code segment 3 start: 4 mov cx, 10 5 mov dl, '0' 6 s: mov ah, 2 7 int 21h 8 add dl, 1 9 loop s 10 mov ah, 4ch 11 int 21h 12 code ends 13 end start

 

 

 

程序段前512字節為程序段前綴PSP,用於記錄程序的一些信息,查看u知道第一條指令的地址,查看前512字節內容

 

第一條指令的地址是:076A0H

則查看前面256字節內容命令:-d 75A:0 

 

 是 CD 20

 

任務7

下面程序的功能是,完成自身代碼的自我復制:把 mov ax, 4c00h 之前的指令復制到內存0:200開始的 連續的內存單元。 補全程序,並在debug中調試驗證,確認是否正確實現了復制要求

 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 mov ax, 4c00h 14 int 21h 15 ode ends 16 end

(1)cs,程序從頭開始復制,CS:IP指向第一條程序,而第一條程序的存放位置為CS:IP,將段地址傳遞給DS從而讀取指令

   由下圖初始狀態可知,指令mov ax,4c00h位置為0017,則程序為復制0017h前的指令,目標指令共23字節,每次bx+1,需要循環23次

(2)

初始狀態:

 

 運行到 mov ax,4c00

 

 查看是否復制成功

 成功將代碼片段復制到內存0:200h

 

總結

  • 熟練掌握了debug中各種基礎命令的使用,方便進行內存內容的查看和修改,和程序的調試
  • 了解了對於內存空間的不同的分配利用
  • 對各種棧空間、棧片段與內存空間的關系有了進一步理解,能夠區分和利用各種棧寄存器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM