(請保留 -> 作者:羅冰 )
在開發過程中,我主要采用兩種方式進行調試,一是使用Debug.exe,通過U盤或者CD光牒,啟動DOS,用debug觀察程式是否如想象中的寫入硬碟指定區域。在早期的版本中,我也曾經去除了寫硬碟以及替換MBR的功能,編譯了可以在DOS下運作的Foxdisk,友善自己在DOS下對其進行調試。Debug是個很好的工具,當年開發隔離卡和雙網隔離計算機的所有底層代碼,均是依靠它來進行的,簡單而強大。
另外一種調試方式則必須借助虛拟機了,我最常用的是使用bochs,它自帶的調試功能,允許程式員看到所有的執行過程,當然也包括MBR的運作,以及如何把控制權轉交給Foxdisk。因為Foxdisk是圖形模式,進入圖形模式之後,debug就沒辦法發揮作用了,後期所有的開發調試都是借助了bochs才得以進行下去。
當然,所有的調試環境使用的都是X86的彙編代碼,intel指令集的參考書得常備手邊。
Debug的指令不多,如圖1所示,大概20幾條,很容易記憶。
圖1 debug常用指令
以一個例子開始debug的使用,嘗試用debug将MBR區(也即硬碟線性位址LBA0)的512位元組讀出,并存到檔案mbr.bin中。在當年流行mbr病毒的時候,這是經常使用的方法。
如圖2,使用指令’a’,編寫一串彙編指令。
圖2 讀取mbr
Debug中所有資料預設都是16進制的,int 13實際上表示的是int 0x13(或者說int 13h)。使用int 0x13的02功能,讀取mbr所在的位置(磁頭0,磁柱0,扇區1)的資料,并拷貝到記憶體偏移0x200處(目前段)。
使用指令’d’檢視讀取到的資料。這是Foxdisk中Loader.asm編譯後的二進制碼,安裝的時候寫入到了mbr區域。
圖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。