DoxBox環境匯編的Debug調試以及相關知識


DoxBox中使用Debug程序進行匯編調試以及編碼


Debug基本功能介紹

R命令,查看改變CPU寄存器的內容

點擊查看
-r ax //修改ax寄存器內容
ax 0000 //自動顯示當前ax寄存器內容為0000
:1111 //將ax寄存器修改為1111

D命令,查看內存中的內容

點擊查看
-d 1000:0 //格式為 段地址:偏移地址
-d 1000:0 f //查看偏移地址0到f中的內存內容

E命令,改寫內存中的內容

點擊查看
-e 1000:0 0 1 2 3 4 5 6 7 8 9 //修改1000:0 為 0;修改1000:1 為 1,以此類推。
-e 1000:10
1000:10 原始數據.待寫入數據 原始數據.待寫入數據 原始數據.待寫入數據 原始數據.待寫入數據......

U命令,將內存單元中的內容翻譯為匯編指令,並顯示出來

點擊查看
-u 1000:0

T命令,執行一條機器指令
A命令,以匯編指令的格式在內存中寫入一條機器指令

點擊查看
-a 1000:0
1000:0000 要寫入的指令
1000:0003 要寫入的指令
1000:0006 mov cx,3

編譯,鏈接

先編譯,后鏈接。
masm 源程序文件名.asm; //注意,分號打一下,直接跳過一些選擇
masm源程序后會生成OBJ文件,我們需要將OBJ文件鏈接成為EXE文件
link 源程序文件名.obj; //分號打一下
link之后就會生成EXE文件,我們直接使用debug 文件名.exe 或者直接在命令行中輸入 文件名 即可運行

嘗試修改ROM內容

PC機主板上的ROM中有一個生產時期,在內存FFF00H~FFFFFH的某幾個單元中,請找到這個時期,並試圖修改它

  • 第一步使用debug程序中的D命令找出時期


可以看到時間是1992年1月1日,30年前。

  • 嘗試修改ROM內存單元的內容


可以看到執行修改命令后並沒有變化。這是因為ROM(Read-Only Memory)內存是只讀內存,不能修改

使用E命令向內存單元填寫數據

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

結果如下
-e b800:0 03 04 03 04 03 04 03 04 03 04

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

-f b800:0f00 0f9f 03 04
結果如下

棧的使用

已知內存單元00201H ~ 00207H分別存放數據(如下圖所示),00220H ~ 0022fH用作棧空間。

在debug環境中,按順序錄入以下內容,單步跟蹤調試,觀察寄存器和內存空間00200H~00207H,以及,棧空間00220 ~ 0022fH內容變化情況。記錄實驗結果。回答問題,驗證和你的理論分析結果是否一致。

分析:
首先將內存20:0 - 20:7 的內存置為 10 20 30 40 50 60 70 80
然后寫入匯編指令
將20用作內存段地址,將20也用作棧內存段地址
棧頂處於20:30處
push [0],將20:0 處的值放入棧中,sp-2,然后放入,所以20:2E處為10 20
push [2],將20:0 處的值放入棧中,sp-2,然后放入,所以20:2C處為30 40
以此類推
pop [6]將棧頂元素放入內存單元0處,先放入,后sp+2,所以20:6處為70 80
以此類推
20:04 50 60
20:02 30 40
20:00 10 20
接下來進行實際操作,查看情況

可以看到符合分析

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

分析:會變成70 80 50 60 30 40 10 20

可以看到符合分析

棧段和棧頂指針

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

先使用f命令,把00220H ~ 0022fH區間的16個字節內存單元值全部修改為0。並使用d命令查看確認。
然后,使用a命令、r命令、t命令寫入匯編指令並單步調試。
觀察並思考:

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

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

對於問題1的解答:mov ss,ax和mov sp,30 連續執行。在此期間CPU不響應其他中斷,debug的單步調試就是一種中斷,由於CPU在執行期間不響應中斷請求,所以debug顯示的是CPU執行完棧段和棧頂指針分配后的情況。
對於問題2的解答:08 01 是IP地址,即偏移地址。3F 07 是CS地址,即程序段地址,是暫存地址,因為存在中斷,所以需要暫存原來程序的入口,所以存了下來。

程序段前綴

使用任何一款文本編輯器,編寫8086匯編程序源碼。

assume cs:code
code segment
start:
mov cx, 10
mov dl, '0'
s: mov ah, 2
int 21h
add dl, 1
loop s
mov ah, 4ch
int 21h
code ends
end start

使用masm、link,匯編、鏈接,得到可執行文件task5.exe。運行程序。結合程序運行結果,理解程序功能。使用debug工具,調試task5.exe。根據第4章所學知識,任何可執行程序在執行時,都有一個引導程序負責將其加載到內存,並將CPU控制權移交給它,也即將CS:IP指向可執行程序中第一條機器指令。在加載可執行程序時,可執行前面512字節是程序段前綴PSP(Program Segment Prefix),用於記錄程序一些相關信息。在debug中,使用d命令,查看task5.exe的程序段前綴,觀察這256個字節的內容,驗證前兩個字節是否是CD 20。

程序運行結果如下:

可以看到在shell中輸出了1234567890
調用int 21h系統中斷,執行shell輸出操作。中斷參數放在ax寄存器中,參數為0002。

查看程序段前綴

可以看到CD 20以及程序名

程序復制

可以看到完美復制。
具體代碼如下

assume cs:code
code segment
    mov ax,cs
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,cx
    s:mov al,ds:[bx]
    mov es:[bx],al
    inc bx
    loop s

    mov ax,4c00h
    int 21h
code ends
end

分析:cs是程序入口段地址。cx是程序長度


免責聲明!

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



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