版本1:載入img直接使用設定檔,可以使用斷點!!
保護模式的程式沒有辦法直接調試。所謂的直接調試,指的是使用debug這樣工具
進行的調試,無論是debug32 還是傳說中的softice for dos 都不可以。唯一的方法是在
虛擬機器上進行的調試。有一款虛擬機器,就是專門為這樣的事情設計的。他就是BOCHS。
關於這個軟體的使用,在此就不介紹了。主要說一下如何進行保護模式的程式的調試。
第一個問題是:Bochs是為了調試保護模式的作業系統設計的。就是說,從引導過程開始的
程式,而不是已經進入了純dos,再進入保護模式的程式。對於這個問題,我們的思路是,
設定好斷點,進入dos之後,讓我們的程式觸發中斷即可…….
查一下Bochs的手冊,上面有記憶體讀寫的中斷,於是首先選擇了這樣的指令:
watch read [addr]
但是隨後發現,不知道為什麼,程式無法觸發這樣的中斷。也許是因為addr給出的
地址是線性地址,而我們的程式,最開始,只能觸發[seg:ofs]這樣的地址。(說明:我發現
Bochs中,即使這兩種格式即使指向相同的物理地址,對斷點來說也是不同的)。
第二個問題就是:設定一種容易實現的斷點,最終,發現Bochs在執行斷點上是可以
區分的。我們只要設定一個絕對執行的位置就可以了。編寫程式如下:
jmpSeg equ 600*1024 /16 ;打算修改的段
mov ax,jmpSeg
mov ds,ax ;ds=打算修改的段
xor si,si
mov ax,ds:[si] ;修改 ds:0 的位置
push ax ;安全起見,在堆棧儲存這個位置的值
mov byte ptr ds:[si],0CBh ;將這個位置設定為 retf
push offset back ;設定返回位置
push cs
db 0EAh ;遠跳轉
dw 0
dw jmpSeg
back: ;跳過去後馬上回來
pop ax
mov ds:[si],ax ;再恢複下面就是繼續執行了
思路就是我們在記憶體中挖出一個絕對位置的“洞”,然後程式跳進這個洞,這個洞裡面
放的是返回,一下又回來。只要我們監視這個洞就好了。當然,安全起見,這個洞最後還要
再添上。另外,這個洞選擇的位置,我只是隨便選在600K的位置,其實還可以選擇在[40:0]
這一片位置,不過我想在虛擬機器運行過程中,可能會讀這個位置,需要運行幾次才可以,
操作上比較麻煩就沒有選擇。
程式做好了命名為bo.asm,編譯為bo.exe。格式化一張磁碟片,放上dos系統的那三個
必要的檔案,再考上bo.exe. 之後,將磁碟片做成img檔案(我一般用hdcopy).這個img要
丟到bochs的目錄下,就是的目錄中。
1.,運行bochsdbg
2.選擇3,我們要讀入bo.img
3.選擇10
4.選擇1
5.分別輸入 bo.img auto 最後一項直接斷行符號
6.不斷斷行符號,一直返回到第一個畫面
7.這個就是第一個畫面了,斷行符號,開始運行
8.開始運行了,會在類比第一條指令開始的時候停下來
9
.輸入 vb 0x9600:0 下斷點
10.輸入 c 讓它繼續執行
11.模擬器這邊就進入dos了~
12.運行 bo.exe 看,停在我們設定的斷點了。
這個位置也算是程式的開始,下面可以使用s命令跟蹤了~