第 四 章 如何使用中斷點指令
§4.1 序言
Soft-ICE 具有以往只有硬體除錯器才具有的中斷點能力。因爲 80386 晶片的
威力和彈性,使我們不需要額外的硬體設備就能有更強大的中斷點能力。
中斷點的觸發可以由記憶體某位址的讀取、記憶體範圍的讀取、程式的執行及
埠的存取來達成。Soft-ICE 賦與每個中斷點一個一位的 16 進位號碼(0-F)
。這個中斷點號碼是當你對中斷點做刪除、中止、啓動、編輯等動作時使用。
Soft-ICE 的所有中斷點都是 "sticky" 。這個意思是這些中斷點在啓動後不會
自動消失。你必需以 BC 或 BD 指令來消除或關閉它。Soft-ICE一次可以處理16
箇中斷點。同種形態的中斷點最多可以有 10 個。但記憶體位址的中斷點(BPM)
因 80386 處理器之暫存器的緣故,最多隻能設 4 個。
中斷點可以設個計數參數。計數參數是中斷點真正觸發作用前被忽略的次數。
§4.2 設置中斷點
指令:
BPM BPMB BPMW BPMD --- 在記憶體位址被存取或執行時引發中斷
BPR --- 對記憶體範圍設置中斷點
BPIO --- 對 I/O 埠存取時觸發中斷
BPINT --- 呼叫插斷時觸發中斷
BPX --- 設置 / 清除 執行中斷點
CSIP --- CS:IP 範圍的檢定判斷
BPAND --- 等待複合中斷點的發生
BPM BPMB BPMW BPMD --- 在記憶體位址被存取或執行時引發中斷
語法: BPM [size] address [verb] [qualifier value] [C=count]
size --- B 、W 、D
B -- byte 位元組 W -- word 字組 D -- Double word 雙字組
size 是指中斷點所涵蓋的範圍。舉例來說,如果使用的是雙字組
,而其第三個位元組被改變了,就會引發中斷。如果有指定判斷資
格 (qualifier) ,size 也是很重要的。
verb --- R 、W 、RW 或 X
qualifier --- EQ 、NE 、GT 、LT 、M
EQ -- 相等 NE -- 不等 GT -- 大於
LT -- 小於 M -- 遮罩
qualifier 只有在讀寫中斷點纔有用到。
value --- 由中斷點大小決定是位元組、字組或雙字組的值
解說:
BPM 指令會在記憶體讀、寫或執行時引發中斷。
verb 內定值爲 RW ; size 內定值爲 byte 。
除了 X 外的 verb 值會使程式執行引發中斷的那段程式碼。CS:IP 所指的是
引發中斷的後一行程式碼。如果verb值是X ,CS:IP 所指的是中斷點設置的位
置。
如果設定的是 R ,當記憶體位址被讀取或做沒有改變的寫入時,將引發中斷。
如果設定的是 R 、W 、RW 時,指定的位址被執行時並不會引發中斷。
〔注〕如果使用 BPMW ,指定的位址必需由字組邊界開始。如果使用 BPMD ,
指定的位址必需指向一個雙字組邊界。
〔例〕 BPM 1234:SI
這道指令設定一個位元組的記憶體存取中斷點。當10H第三次寫入1234:SI
時將啓動中斷點。
〔例〕 BPM CS:1235 X
這道指令設定一個執行中斷點。當 CS:1235 的程式碼被執行時將引發中斷
。此時 CS:IP 所指的就是中斷點設定位址。
〔例〕 BPMW DS:F00 W EQ M 0XXX XXXX XXXX XXX1
這道指令設定一個字組的記憶體寫入中斷點。當 DS:F00 被寫入一個高位
元爲 0 ,低位元爲 1 (其它位元不考慮)的資料時,將引發中斷。
〔例〕 BPM DS:1000
這道指令設定一個位元組的記憶體寫入中斷點。當 DS:1000 被寫入一個大
於 5 的值時,將引發中斷。
BPR --- 對記憶體範圍設置中斷點
語法: BPR start-adderss end-address [verb] [C=count]
start-address 、end-address --- 界定範圍的開始及結束位址
verb --- R 、W 、RW 、T 或 TW
解說:
BPM 指令讓你對一段記憶體範圍設中斷點。
除了 T 和 TW 外的 verb 值均會執行引發中斷的程式碼。CS:IP 將指向引發
中斷的下一段程式碼。
你不能設定執行的範圍中斷點。如果想做到執行的範圍中斷點必需使用 R 。
程式碼的引出被視爲是對範圍中斷點的讀取。
如果未指定 verb ,內定值是 W 。
在某些狀況下,設置範圍中斷點會降低系統的性能。Soft-ICE 將會分析所有
對包括範圍中斷點的4K記憶體的讀寫動作。性能的降低通常無法察覺,但也可
能有嚴重降低的例外。
verb 值使用 T 或 TW 將在指定範圍內可以做回溯追蹤 (back trace) 。它
們並不會真正引發中斷而只是記錄下程式碼的資料。這個資料可以用 SHOW 或
TRACE 指令顯示出來。參閱第九章以取得更多有關回溯追蹤的資訊。
〔例〕 BPR B000:0 B000:1000 W
這道指令定義一個記憶體範圍的中斷點。任何對單色影像記憶體的寫入均
會引發中斷。
BPIO --- 對 I/O 埠存取時觸發中斷
語法: BPIO port [verb] [qualifier value] [C=count]
port --- 一個位元組或字組形態的值
verb --- R 、W 或 RW 。 R -- read ( IN ) W -- write ( OUT )
qualifier -- EQ 、NE 、GT 、LT 、M
EQ -- 相等 NE -- 不等 GT -- 大於
LT -- 小於 M -- 遮罩
value -- 一個位元組或字組形態的值
解說:
BPIO 指令會在 I/O 埠讀寫時引發中斷。
如果有指定 value 值,它將被拿來和引發中斷的 IN 、OUT 程式碼所讀/寫
的真正資料值做比較。value可以是一個位元組或字組。如果是對一個位元組的
埠做 I/O ,則是使用較低的 8 位元來做比較。
CS:IP 將會指向引發中斷之程式碼的後一段程式碼。
如未指定 verb ,內定值是 RW 。
〔例〕 BPIO 21 W NE FF
這道指令定義一個 I/O 埠存取中斷點。如果一號中斷控制器的遮罩暫存器
被寫入除了 FFh 之外的值,將會引發中斷。
〔例〕 BPIO 3FE R EQ M 11XX XXXX
這道指令定義一個位元組的 I/O 埠讀取中斷點。如果 3FEh I/O 埠被讀取
,且這個值的二高位元是 1 時,將會引發中斷。其它位元可以是任意值。
BPINT --- 呼叫插斷時觸發中斷
語法: BPINT INT-NUMBER [ <
int-number --- 由 0 到 FFh 的插斷號碼
value --- 一個位元組或字組的值
解說:
BPINT 指令可以在呼叫硬體插斷或軟體插斷時引發中斷。藉由指定 AX 暫存
器之值可以輕易分離指定的 DOS 或 BIOS 呼叫。
如果沒有指定 value 值,在呼叫指定的插斷向量時將引發中斷。這個插斷可
以是硬體插斷、軟體插斷或內部插斷。
選定的 value 值當插斷髮生時將和指定的暫存器比較 (AH 、AL 或 AX) 。
如果其值和指定的暫存器值相同時,將引發中斷。
中斷點引發時,如果是硬體插斷,CS:IP 將指向此插斷程序的第一段程式碼
。使用INT?指令可以得知此插斷呼叫發生時執行到哪裏。如果是軟體插斷,則
CS:IP 將指向呼叫此插斷的程式碼。
〔例〕 BPINT 21 AH=
這道指令定義一個 21h 插斷的中斷點。當 DOS 4Ch 函式(結束程式)被
呼叫時將引發中斷。
BPX --- 設置 / 清除 執行中斷點
語法: BPX [address] [C=count]
解說:
BPX指令讓你在原始程式中設置/清除執行中斷點。如果遊標在程式碼窗中
,則不需要輸入位址,執行中斷點將設置在目前遊標所在位址。如果目前遊標所
在位址已經設置一個執行中斷點,則將清除此中斷點。
如果程式碼窗是不可見的或遊標未在其中,則必!指定位址。如果只有指定差
距位址,目前的 CS 值會被當做節段位址。
〔注〕除非中斷點的位置在 ROM 中,不然BPX 均使用INT 3的方式設置中斷點
。用這樣來取代中斷點暫存器是爲了能設置更多的中斷點。如果你的處境
因某些原因必需使用中斷點暫存器(例如說程式碼未載入),你可以用
BPM 指令設置執行中斷點。
〔例〕 BPX .1234
這道指令將在原始程式第 1234 行設置中斷點。
CSIP --- CS:IP 範圍的檢定判斷
語法: CSIP [OFF | [NOT] start-address end-address]
NOT --- 如果使用 NOT ,只有當 CS:IP 所指超出範圍,纔會引發中斷。
OFF --- 停止對 CS:IP 的檢定。
解說:
CSIP 指令會使中斷點的成立條件由指令指標所指位址而定。這個功能在你懷
疑程式會突然修改其範圍之外的程式碼時特別有用。
當中斷點條件成立時,CS:IP 暫存器會被拿來和指定的範圍做比較。當其在
範圍內時會引發中斷。要在CS:IP指在範圍外時引發中斷,則需要用 NOT 參數。
如果沒有加參數則會顯示目前 CSIP 的範圍。
〔例〕 CSIP NOT F000:0 FFFF:0
這個指令只有在中斷點條件成立且 CS:IP 並未指向 ROM BIOS 時纔會引發
中斷。
BPAND --- 等待複合中斷點的發生
語法: BPAND list | * | OFF
list --- 一串由逗號或空白分開的中斷點號碼。
* --- 複合所有的中斷點。
解說:
BPAND 指令會對二或多箇中斷點做邏輯的 AND 運算。只有當所有的中斷點條
件均成立時纔會真正引發中斷。
有些情況下你會希望在許多不同條件均成立下才引發中斷。BPAND 指令讓你
指定二或多個在中斷髮生前必需成立的中斷點。這個功能讓你可以設置更復雜的
中斷點條件。
每次使用 BPAND 指令均會把指定的中斷點號碼加入名單中,直到使用
BPAND OFF 指令爲止。
你可以用 BL 指令列出中斷點以察看哪些中斷點號碼被複合在一起。被複合
在一起的中斷點其中斷點號碼後會有個 & 。
一旦中斷點被複合後,除非此中斷點被清除或 BPAND 被關閉纔會中止。
〔例〕 BPAND 0,2,3
這道指令將複合 0 號、2 號、3 號中斷點。只有當三個的條件均成立時才
會引發中斷。例如:如果 2 號 和 3 號的條件均成立一次以上,但 0 號的條
件尚未成立,則只有當 0 號的條件成立時纔會引發中斷。
§4.3 處理中斷點
Soft-ICE 提供許多指令來處理中斷點。處理類的指令可以用來列出、修改、刪
除、啓動和中止中斷點。中斷點是以由0h到Fh的中斷點號碼來識別的。處理中
斷點的指令有:
BD --- 中止中斷點
BE --- 啓動中斷點
BL --- 列出中斷點
BPE --- 編輯中斷點
BPT --- 把中斷點當樣板
BC --- 清除中斷點
BD --- 中止中斷點
語法: BD list | *
list --- 一串由逗號或空白分開的中斷點號碼。
* --- 中止所有中斷點。
解說:
BD 指令是用來暫時中止中斷點的活動的。中斷點可用BE指令(啓動中斷點
)重新啓動。
你可以用 BL 指令列出中斷點以察看哪些中斷點被中止了。被中止的中斷點
其中斷點號碼後會有一個 * 。
〔例〕 BD 1,3
這道指令會暫時中止 1 號和 3 號中斷點。
BE --- 啓動中斷點
語法: BE list | *
list --- 一串由逗號或空白分開的中斷點號碼。
* --- 啓動所有中斷點。
解說:
BE 指令是用來重新啓動被 BD 指令中止的中斷點。當中斷點第一次定義時將
會自動啓動。
〔例〕 BE 3
這道指令會啓動 3 號中斷點。
BL --- 列出中斷點
語法: BL
解說:
BL 指令會顯示所有目前設定的中斷點。BL 指令會列出每個中斷點的中斷點
號碼、中斷點條件、中斷點狀態和計數。
中斷點的狀態分爲啓動和中止。中止的中斷點其中斷點號碼後會有個 * 。在
BPAND指令中使用到的啓動的中斷點其中斷點號碼後面會有個& 。最後一個引發
中斷的中斷點會以高亮度顯示。
BL 指令沒有參數。
〔例〕 BL
這道指令會顯示所有定義的中斷點。以下列出一個 4 箇中斷點的例子:
0) BPMB 1234:0000
1) BPR B000:0000 B000:1000 W C=01
2) BPIO 00021 W NE OOFF C=01
3) BPINT 21 AH=
BPE --- 編輯中斷點
語法: BPE break-number
解說:
BPE 指令會把中斷點的敘述放到編輯行以供修改。然後你可以用編輯鍵重新
編輯,按 Enter 重新輸入。這個指令讓你可以快速修改原有中斷點的參數。
〔例〕 BPE 1
這道指令會把 1 號中斷點的敘述搬到編輯行並清除原 1 號中斷點。按
Enter 可以把這個中斷點重新輸入。
BPT --- 把中斷點當樣板
語法: BPT break-number
解說:
BPT 指令會把已存在的中斷點敘述拿來當新中斷點的樣板。
原存在的中斷點敘述會被放到編輯行去。中斷點號碼所指的中斷點並沒有任
何改變。這個指令讓你可以快速的設置和原中斷點相似的新中斷點。
〔例〕 BPT 3
這道指令會把 3 號中斷點的樣板放入編輯行。當你按下 Enter 後會增加
一個新中斷點。
BC --- 清除中斷
語法: BC list | *
list --- 一串由逗號或空白分開的中斷點號碼。
* --- 啓動所有中斷點。
解說:
BC 指令是用來永遠清除一個或多箇中斷點的。
〔例〕 BC *
這道指令會清除所有的中斷點。