┌──────────────────┐
                  │  第  二  節       指        令     │
                  └──────────────────┘

      第二節包括每個指令的語法、解釋及範例。所有的數字均以 16 進位表示。使
  用到 + - * / 或暫存器的數字均可視為運算式。所有的指令都不區分大小寫。指令
  語法敘述中的斜體字需以真實的值代替而不是打入斜體字。

      以下是本節中所使用的代號:

          [ ]  ---  語法中非必用的部份

          < >  ---  可選用的部份

          X|Y  ---  使用 X 或 Y  ( X Y 擇一使用 )

        count  ---  count 指定中斷點條件要成立幾次才會真正引發中斷。如果沒
                    有設定,內定值是 1 。每次引發中斷而叫出 Soft-ICE 的視窗
                    後,記數器自動回復為原先指定值。

         verb  ---  指定在什麼狀況下中斷點會做用。R 代表讀取;W 代表寫入;
                    RW 代表讀取及寫入;X 代表執行。

      address  ---  位址。由兩個 16 位元之字組以冒號分隔而組成。第一個字組
                    代表區段位址,第二個字組代表差距位址。位址可以由符號或
                    暫存器構成,也可以包括 $ 、. 、@ 等特殊符號。參閱
                    §3.8 以取得更多資訊。

      break-number  ---  中斷點號碼是在你修改中斷點(即編輯、刪除、重新啟動
                         、暫停作用)時使用的。它是用來代表各中斷點的代碼。
                         中斷點號碼是由 0 到 F 。

         list  ---  一串由逗號或空白分隔的中斷點號碼。

         mask  ---  由 1 、0 、X 所構成的位元遮罩。X 代表不處理的位元。

               例如: BPIO 21W EQ M 1XXX XXXX
                      如果 21 埠被寫入且造成其高位元被設定則會引發中斷。

                    第   四   章       如何使用中斷點指令

§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 W EQ 10 C=3

          這道指令設定一個位元組的記憶體存取中斷點。當 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 W GT 5
          這道指令設定一個位元組的記憶體寫入中斷點。當 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 [ < AL | AH | AX > = value] [C=count]

        int-number --- 由 0 到 FFh 的插斷號碼

        value --- 一個位元組或字組的值

  解說:

        BPINT 指令可以在呼叫硬體插斷或軟體插斷時引發中斷。藉由指定 AX 暫存
    器之值可以輕易分離指定的 DOS 或 BIOS 呼叫。

        如果沒有指定 value 值,在呼叫指定的插斷向量時將引發中斷。這個插斷可
    以是硬體插斷、軟體插斷或內部插斷。

        選定的 value 值當插斷發生時將和指定的暫存器比較 (AH 、AL 或 AX) 。
    如果其值和指定的暫存器值相同時,將引發中斷。

        中斷點引發時,如果是硬體插斷,CS:IP 將指向此插斷程序的第一段程式碼
    。使用 INT? 指令可以得知此插斷呼叫發生時執行到哪裡。如果是軟體插斷,則
    CS:IP 將指向呼叫此插斷的程式碼。

    〔例〕 BPINT 21 AH=4C
          這道指令定義一個 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 W EQ 0010 C=03
            1) BPR B000:0000 B000:1000 W C=01
            2) BPIO 00021 W NE OOFF C=01
            3) BPINT 21 AH=4C C=01

        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 *
          這道指令會清除所有的中斷點。