天天看點

Foxdisk07-如何調試1

(請保留 -> 作者:羅冰 )

在開發過程中,我主要采用兩種方式進行調試,一是使用Debug.exe,通過U盤或者CD光牒,啟動DOS,用debug觀察程式是否如想象中的寫入硬碟指定區域。在早期的版本中,我也曾經去除了寫硬碟以及替換MBR的功能,編譯了可以在DOS下運作的Foxdisk,友善自己在DOS下對其進行調試。Debug是個很好的工具,當年開發隔離卡和雙網隔離計算機的所有底層代碼,均是依靠它來進行的,簡單而強大。

另外一種調試方式則必須借助虛拟機了,我最常用的是使用bochs,它自帶的調試功能,允許程式員看到所有的執行過程,當然也包括MBR的運作,以及如何把控制權轉交給Foxdisk。因為Foxdisk是圖形模式,進入圖形模式之後,debug就沒辦法發揮作用了,後期所有的開發調試都是借助了bochs才得以進行下去。

當然,所有的調試環境使用的都是X86的彙編代碼,intel指令集的參考書得常備手邊。

Debug的指令不多,如圖1所示,大概20幾條,很容易記憶。

Foxdisk07-如何調試1

圖1 debug常用指令

以一個例子開始debug的使用,嘗試用debug将MBR區(也即硬碟線性位址LBA0)的512位元組讀出,并存到檔案mbr.bin中。在當年流行mbr病毒的時候,這是經常使用的方法。

如圖2,使用指令’a’,編寫一串彙編指令。

Foxdisk07-如何調試1

圖2 讀取mbr

Debug中所有資料預設都是16進制的,int 13實際上表示的是int 0x13(或者說int 13h)。使用int 0x13的02功能,讀取mbr所在的位置(磁頭0,磁柱0,扇區1)的資料,并拷貝到記憶體偏移0x200處(目前段)。

使用指令’d’檢視讀取到的資料。這是Foxdisk中Loader.asm編譯後的二進制碼,安裝的時候寫入到了mbr區域。

Foxdisk07-如何調試1

圖3 寫資料到檔案

如圖3,指令’w’将把BX:CX寄存器中指定位元組數的内容寫磁盤檔案。是以,首先用指令’r’修改寄存器bx和cx。示例中需要儲存的位元組數為512個,是以,bx=0,cx=0x200。

‘w 200’的含義是将ds:0x200處的開始的資料,儲存指定的位元組數到檔案中。

為了便于調試,Foxdisk中有些地方插入了标志字元串,比如Loader.asm開始的“LUOB”,這其實也是為了便于debug定位問題。

特将debug常用的指令記錄在此,友善之後檢視。

-? 顯示 Debug 指令清單

-a [address] 指定鍵入彙編語言指令的位置。對 address 使用十六進制值,并鍵入不以

“h”字元結尾的每個值。如果不指定位址,a 将在它上次停止處開始彙編。

-d [range] 指定要顯示其内容的記憶體區域的起始和結束位址,或起始位址和長度。有如

果不指定 range,Debug 程式将從以前 d 指令中所指定的位址範圍的末尾

開始顯示 128 個位元組的内容。

-t [=address] 從指定位址起執行一條指令後停下來,顯示所有寄存器内容及标志位的

值。如未指定位址則從目前的CS:IP開始執行。

-p [=address] 從指定位址起執行指令,直到遇到斷點,如未指定位址則從目前的CS:

IP開始執行。

-g [=address] 從指定記憶體位址運作目前在記憶體中的程式。

-u [range] 對指定範圍内的存儲單元進行反彙編。

-r [register] ‘r’顯示CPU内所有寄存器内容和标志位狀态,‘r register name’則修改

某個寄存器内容。比如-r ax 修改寄存器ax的内容。

-q 退出debug。

繼續閱讀