SoftIce 使用手冊 5 來源:Chi-hao Tseng
                    第   五   章       使用其它指令

§5.1 顯示及編輯類指令

      指令:

          U  ---  反組譯或顯示原程式碼

          R  ---  顯示或更改暫存器

          MAP  ---  顯示系統記憶體分佈圖

          D  ---  用最後一次指定的形式顯示記憶體

          DB  ---  以位元組的形式顯示記憶體

          DW  ---  以字組的形式顯示記憶體

          DD  ---  以雙字組的形式顯示記憶體

          E  ---  用最後一次指定的形式編輯記憶體

          EB  ---  以位元組的形式編輯記憶體

          EW  ---  以字組的形式編輯記憶體

          ED  ---  以雙字組的形式編輯記憶體

          INT?  ---  顯示最後一次呼叫的插斷號碼

          ? 或 H  ---  顯示輔助訊息

          VER  ---  顯示 Soft-ICE 的版本號碼

        U  ---  反組譯或顯示原程式碼

  語法: U [address] [L [=] length]

        length --- 要反組譯的程式碼長度

  解說:

        U 這個指令會顯示正在除錯的程式的程式碼。

        如果沒有指定 length ,內定值是 8 行或螢幕長度減一。

        如果未指定 address ,這個指令會從最後一次反組譯的後一位元組開始反組
    譯。如果從未使用過反組譯指令,則從目前 CS:IP 開始。

        如果程式碼窗是可見的,則程式碼會顯示在其中。

        如果指定的位址範圍的原始程式碼有載入,由目前的原始碼模式來決定是否
    顯示原始碼。

    〔例〕 U $-10
          這道指令從目前位址的前 10h 位元組開始反組譯。

    〔例〕 u .499
          這道指令會從 499 行開始顯示 原始碼。程式碼窗必需是可見的且必需在
      原始碼模式。

        R  ---  顯示或更改暫存器

  語法: R register-name [ [=] value ]

        register-name --- 為下列任一:
                          AL 、AH 、AX 、BL 、BH 、BX 、CL 、CH 、CX 、DL
                          DH 、DX 、DI 、SI 、BP 、SP 、IP 、CS 、DS 、ES
                          SS 、或 FL

        value --- 如果 register-name 不是 FL ,value 是個 16 進位值或運算式
                  。若 register-name 為 FL ,value 下列旗號符號一或多個的組
                  合。旗號符號可視需要在前面加上 + 或 - 。

                    O -- Overflow flag         溢位旗號
                    D -- Direcrion flag        方向旗號
                    I -- Interrupt flag        插斷旗號
                    S -- Sign flag             正負號旗號
                    Z -- Zero flag             零值旗號
                    A -- Auxiliary carry flag  輔助進位旗號
                    P -- Parity flag           極性旗號
                    C -- Carry flag            進位旗號

  解說:

        R 指令是用來顯示或更改暫存器之值的。

        如果沒有指定參數會顯示所有暫存器和旗號的值及目前 CS:IP 的程式碼。

        如果僅指定 register-name 而未加 value ,則 Soft-ICE 會顯示指定暫存
    器現在的值並提示你輸入新值。如果 register-name 是 FL ,目前設置的旗號會
    以高亮度大寫顯示;未設置的旗號則用普通小寫顯示。要維持現在暫存器的值,
    直接按 Enter 。

        如果 register-name 和 value 均有指定,則指定的暫存器的值將被改成
    value 。

        想要改變旗號的值,把 FL 當 register-name ,後接你想切換的旗號符號。
    如果要設置某旗號,在旗號符號前加上 + 。要關閉某旗號,則在旗號符號前加上
    一個 - 。旗號可以按任何順序排列。

    〔例〕 R AH 5
          這道指令會把 AH 暫存器的值改成 5 。

    〔例〕 R FL = O Z P
          這道指令會切換 O 、Z 、P 旗號的值。

    〔例〕 R FL
          這道指令會顯示目前旗號的值並讓你可以修改其值。

    〔例〕 R FL O +A -C
          這道指令會切換 O 旗號,設置 A 旗號並關閉 C 旗號。

        MAP  ---  顯示系統記憶體分佈圖

  語法: MAP

  解說:

        MAP 指令顯示各記憶體部份的名稱、位置和大小。大小是以頁來計算的。一
    頁等於 10h byte 。

        CS:IP 所指的部份會以高亮度顯示。

        使用 MAP 指令的時機:

        * 中斷點發生時指向未知的記憶體區段。

        * 你想控制常駐程式或系統程式。你可以根據 MAP 指令所顯示的開始位址
           漢大小來設置範圍中斷點。

        * 你懷疑程式或系統在其記憶體空間之外寫碼。MAP 指令可用來找出此區段
           的記憶體位址以便在 CSIP 中使用。

        * 你必需找出哪個常駐程式擁有目前的插斷向量。

    〔例〕 MAP
          以下是這道指令顯示的範例:

             ..........

          若 DOS 的版本低於 3.1 ,將顯示程式的位址而非其程式名稱。

        D DB DW DD  ---  顯示記憶體

  語法: D [size] [address] [ L [=] length ]

        size ---   B -- byte    W -- word    D -- double word

        length --- 要顯示幾位元組。

  解說:

        D 這個指令會顯示指定位址的記憶體內容。

        記憶體內容是以指定的 size 的形式顯示。如果沒有指定 size ,會以最後
    一次使用的 size 來顯示。所有的形式均會顯示 ASCII 碼。

        如果未指定 address ,則由前一次顯示的最後一位元組的後一位元組開始顯
    示。

        如果沒有指定 length ,內定值是 8 行或因視窗較小而少一些。

        若資料窗是可見的,則資料會顯示在資料窗且 length 會被忽略。

    〔例〕 DW DS:00 L=8
          這道指令會以字組和 ASCII 的形式顯示目前資料節段的前 8 位元組。

        E EB EW ED  ---  以位元組的形式編輯記憶體

  語法: E [size] address [data-list]

        size ---   B -- byte    W -- word    D -- double word

        data-list --- 一串指定之 size 的資料,(位元組、字組或雙字組)或以
                      逗號、空白分隔的加引號字串。加引號的字串可以使用單引
                      號或雙引號。

  解說:

        E 指令顯示指定位址的記憶體內容並讓你編輯其值。

        這個指令以 ASCII 的形態顯示記憶體內容,並且是以指定的 size 形態。

        記憶體編輯器讓你可以快速的更新記憶體。你可以鍵入 ASCII 字元或打入位
    元組、字組、雙字組之值以編輯記憶體。如果沒有指定 size ,以最後一次使用
    的 size 為準。以下是記憶體編輯的按鍵:

          --- 游標上移
          --- 游標下移
          --- 游標右移
          --- 游標左移
        SPACE --- 游標移至下一個元素上
        TAB --- 在數字區和 ASCII 區間切換
        ESC 或 Enter --- 離開記憶體編輯器

        在你輸入資料之時,真正記憶體上的值也隨之更新。所有的數字值都是以 16
    進位表示。按 TAB 鍵可以在數字區和 ASCII 區間切換。

        如果資料窗是可見的,則在其中修改資料;否則在指令窗中修改。

        資料顯示的長度,在指令窗中內定為 8 行。如果資料窗是可見的,則和資料
    窗同大小。

        如果未加參數且資料窗是可見的,則游標會移到資料窗中。若資料窗是不可
    見的,則在指令窗中由最後一次顯示或編輯的位址開始進行編輯。

    〔例〕 EB 1000:0
          這道指令由 1000:0000 開始,以位元組的形態,用數字和 ASCII 字元顯
      示資料的值。你可以編輯這些顯示出來的值。

    〔例〕 EB 8000:0 "HELLO",0D
          這道指令把從 8000:0000 開始的值以 HELLO 字串和一個歸位字元代替。

        INT?  ---  顯示最後一次呼叫的插斷號碼

  語法: INT?

  解說:

        INT? 指令顯示最後一次發生的插斷號碼及其位址。

    〔例〕 INT?
          以下是 INT? 顯示結果的例子:

              Last Interrupt: 16
              At: 0070:0255

          這個例子顯示在 Soft-ICE 視窗被叫出之前,系統最後一次呼叫的是 16h
      插斷,位址在 0070:0255 。如果最後一次插斷是個軟體插斷,從 0070:0255
      做反組譯會顯示此插斷的程式碼。若是個硬體插斷,反組譯則會顯示插斷發生
      時所執行的程式碼。

        ? 或 H  ---  顯示輔助訊息

  語法: < ? | H > [command | expression]

  解說:

        ? 和 H 指令兩者均會顯示輔助訊息。

        如果未指定參數將會一次一個螢幕的顯示所有指令和運算子的簡單解說。按
    任意鍵以繼續顯示或按 ESC 鍵離開輔助說明。

        若有指定參數則會顯示包括指令語法及範例的詳盡說明。

        如果加上運算式,則會計算並以 16 進位、10 進位及 ASCII 字元顯示其結
    果。

    〔例〕 ? ALTKEY
          這道指令會顯示包括 ALTKEY 指令的語法及範例的資料。

    〔例〕 H 10 + 14*2
          這道指令會顯示: 0038 00056 "8" 。這是 10+14*2 的 16 進位、10 進
      位值及 ASCII 字元。

        VER  ---  顯示 Soft-ICE 的版本號碼

  語法: VER

    〔例〕 VER
          這道指令會顯示 Soft-ICE 的版本及 Nu-Mega 的版權訊息。

§5.2 I/O 埠指令

      指令:

          I 、IB  ---  由位元組 I/O 埠輸入

          IW  ---  由字組 I/O 埠輸入

          O 、OB  ---  由位元組 I/O 埠輸出

          OW  ---  由字組 I/O 埠輸出

        I 、IB 、IW  ---  由 I/O 埠輸入

  語法: I [size] port

        size ---   B -- byte    W -- word    D -- double word

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

  解說:

        這個由埠輸入的指令是用來讀取及顯示硬體埠之值的。你可以從位元組或字
    組埠輸入。如果沒有指定 size ,內定值是位元組。

    〔例〕 I 21
          這道指令是顯示一號中斷控制器的遮罩暫存器之值。

        O 、OB 、OW  ---  由字組 I/O 埠輸出

  語法: O [size] port value

        size ---   B -- byte    W -- word    D -- double word

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

        value --- 位元埠為一位元組值;字組埠為一字組值

  解說:

        對埠輸出的指令是用來對硬體埠寫值的。你可以對位元組埠或字組埠做輸出
    ,如果沒有指定 size ,內定值是位元組。

    〔例〕 O 21 FF
          這道指令會遮罩住一號中斷控制器的所有中斷。

§5.3 轉換控制指令

      指令:

          X  ---  離開 Soft-ICE 之視窗

          G  ---  執行到某位址

          T  ---  追蹤一道程式碼

          P  ---  單步執行程式

          HERE  ---  執行到目前游標那行

          GENINT  ---  強制某一插斷

          EXIT  ---  強制離開目前之 DOS 程式

          BOOT  ---  載入系統 (保留 Soft-ICE )

          HBOOT  ---  硬體系統載入 (完全重設)

        X  ---  離開 Soft-ICE 之視窗

  語法: X

  解說:

        X 指令會離開 Soft-ICE 視窗並恢復因叫出 Soft-ICE 而中斷的程式之控制
    權。Soft-ICE 視窗會消失。如果有設置任何中斷點,它將被啟動。

    〔例〕 X

        G  ---  執行到某位址

  語法: G [=staer-address] [break-address]

  解說:

        G 指令會離開 Soft-ICE 視窗並設置一個只用一次的執行中斷點。除此之外
    ,所有的 sticky 中斷點也會被啟動。

        若有指定 start-address 參數,將從 start-address 開始執行;否則會從
    目前的 CS:IP 開始執行。程式將一直執行,直到達到 break-address 、使用了
    叫出視窗的熱鍵或 sticky 中斷點發生才會停止。

        break-address 必需是一道程式碼的第一位元組。

        當達到指定的 break-address 時,CS:IP 將指向設置中斷點的位置。

        未加參數的 G 指令和 X 指令有相同的作用。

        除非所有的中斷點暫存器都被 sticky 中斷點佔滿了,不然 non-sticky 中
    斷點會使用 80386 中斷點暫存器。在這種狀況下,中斷點將會使用 INT 3 方式
    。這種情形下,在 ROM 中 G 或 P 指令將無法正常工作。如果你嘗試這樣做將會
    顯示出錯誤訊息。

    〔例〕 G CS:1234
          這道指令將在 CS:1234 設置一個只用一次的執行中斷點。

        T  ---  追蹤一道程式碼

  語法: T [=start-address] [count]

  解說:

        T 指令使用單步旗號以單步執行一道程式碼。

        如果沒有指定 start-address ,將從目前的 CS:IP 開始執行。若有指定
    start-address ,則 CS:IP 將指向 start-address 以進行單步執行。

        如果有指定 count ,Soft-ICE 將單步執行 count 次。TRACE 指令將持續執
    行直到 count 為零或按了 ESC 鍵,而不管是否有中斷點發生。

        若是在原始碼模式,T 指令會單步到下一道原始碼敘述。如果目前的敘述是
    個程序或呼叫函數且呼叫的程序的原始碼存在,T 指令會單步執行進入這個呼叫
    。如果沒有呼叫的程序或函數的原始碼,T 指令會單步執行完整個程序。

   〔例〕 T = 1284 3
         這道指令會單步執行在記憶體位址 1284 的 3 道程式碼。

        P  ---  單步執行程式

  語法: P

  解說:

        P 指令是個邏輯的程式單步執行。除非目前 CS:IP 之程式碼是呼叫、插斷、
    迴圈或反復字串,不然將執行此程式碼。若為呼叫、插斷等程式碼,將會執行完
    整個程序或反復動作才會回到 Soft-ICE 。

        P 指令會設置一個只用一次的執行中斷點。除非所有的中斷點暫存器都被
    sticky 中斷點佔滿了,不然 non-sticky 中斷點會使用 80386 中斷點暫存器。
    在這種狀況下,中斷點將會使用 INT 3 方式。這種情形下,在 ROM 中 G 或 P
    指令將無法正常工作。如果你嘗試這樣做將會顯示出錯誤訊息。

        若是在原始碼模式,P 指令會單步到下一道原始碼敘述。如果目前的敘述是
    個程序或呼叫函數,P 指令會把它整個執行完。

    〔例〕 P
          這道指令會單步執行程式。

        HERE  ---  執行到目前游標那行

  語法: HERE

  解說:

        HERE 指令會一直執行到目前游標所在那行。只有當游標在程式碼窗中才能使
    用 HERE 指令。如果程式碼窗不可見或游標不在其中,用 G 指令代替。

        HERE 指令會離開 Soft-ICE 視窗並設置一個只用一次的執行中斷點。此外,
    所有的 sticky 中斷點也會被啟動。

        程式將由目前的 CS:IP 開始執行,直到執行到游標所在位置的程式碼、使用
    了叫出視窗的熱鍵或某 sticky 中斷點發生為止。

        除非所有的中斷點暫存器都被 sticky 中斷點佔滿了,不然 non-sticky 中
    斷點會使用 80386 中斷點暫存器。在這種狀況下,中斷點將會使用 INT 3 方式
    。這種情形下,在 ROM 中 G 或 P 指令將無法正常工作。如果你嘗試這樣做將會
    顯示出錯誤訊息。

    〔例〕 HERE
          這個例子在目前游標所在設置一個執行中斷點,然後離開 Soft-ICE 並從
      目前的 CS:IP 開始執行。

        GENINT  ---  強制某一插斷

  語法: GENINT INT1 | INT3 | NMI | interrupt-number

        interrupt-number --- 00 到 FF 中的一個數字

  解說:

        GENINT 指令會強制發生某一插斷。當 Soft-ICE 和另一個軟體除錯器共用時
    ,這個功能可以用來把控制權交給另一個除錯器。這也可以用來測試插斷程序。

        GENINT 指令會模擬執行一道硬體插斷或 INT 程式碼。它將把 falg 、CS 、
    IP 之值推入堆疊,並把 CS 、IP 之值改成插斷向量表中和指定的 interrupt-
    number 相對的進入點。

    〔例〕 GENINT NMI
          這道指令會強制發生一個無法遮罩的插斷。如果 Soft-ICE 和 CodeView
      一起使用,這將把控制權交回 CodeView 。

        EXIT  ---  強制離開目前之 DOS 程式

  語法: EXIT [R] [D]

        R --- 恢復插斷向量表

        D --- 清除所有中斷點

  解說:

        EXIT 指令藉強制執行 INT 21h 的 4Ch 功能來中止目前程式。這個指令只有
    在 DOS 處於可以接受此函數呼叫的狀態下才能使用。如果此呼叫是由目前的中斷
    函式呼叫或是在 DOS  尚未備妥時,系統的行為將無法預期。

        使用 R 參數時,除了中斷向量表外,不會做任何系統重設的動作。這意味著
    BIOS 變數、視訊模式及其它系統層次的資料並不會被還原。

        使用 R 參數會把中斷向量還原成它們最後一次儲存的狀態。Soft-ICE 會在
    其載入時、程式以 LDR.EXE 載入時及使用 VECS S 指令時儲存中斷向量。

    〔註〕依照下列步驟來重新啟動由 LDR.EXE 載入的程式:

              EXIT R
              LDR prog.EXE

          EXIT 指令會把中斷向量表還原成程式載入前之值,然後回到命令處理器。
          由執行 LDR 並加上 .EXE 的尾巴可以把程式重新載入而不需重載符號及原
          始碼。符號和原始碼會保持在記憶體中。

    〔注意〕EXIT 指令必需小心使用。因為 Soft-ICE 可以在任何時候叫出,可能會
            有 DOS 不能接受中止函數呼叫的情形發生。而且 EXIT 指令也不會重置
            程式的狀況。舉例來說,EXIT 指令不會重設視訊模式。如果你的程式把
            BIOS 和硬體放在特別的視訊模式中,使用 EXIT 指令後仍會留在此模式
            中。

    〔例〕 EXIT R
          還原中斷向量表並跳出目前的程式。如果程式是用 LDR.EXE 載入的,則要
      加 R 參數。

        BOOT  ---  載入系統 (保留 Soft-ICE )

  語法: BOOT

  解說:

        BOOT 指令會重置系統並保留 Soft-ICE 。BOOT 可以用來對載入程序、DOS
    驅動程式及非 DOS 的作業系統做除錯。

        BOOT 是以 ROM BIOS 的 19h 插斷呼叫的方法。有時候 19h 插斷可能無法工
    作。如果發生這種狀況,叫出 Soft-ICE 並使用 HBOOT 指令。

        為了讓 BOOT 正確的工作,Soft-ICE 必需由 CONFIG.SYS 中做第一個驅動程
    式載入。這樣 Soft-ICE 才能盡可能的還原系統原始狀態。

    〔例〕 BOOT
          這道指令會重新載入系統。Soft-ICE 依然保留。

        HBOOT  ---  硬體系統載入 (完全重設)

  語法: HBOOT

  解說:

        HBOOT 指令會重置整個系統。在重置的過程中 Soft-ICE 不會保留。除非介
    面卡需要重開電源才能重置否則 HBOOT 就夠用了。在這種罕有的狀況中,你必需
    關掉電源再重新打開。

    〔例〕 HBOOT
          這道指令會重新載入系統。Soft-ICE 必需要重新載入。

§5.4 除錯模式指令

      指令:

          ACTION  ---  設定中斷點發生後的動作

          WARN  ---  設定 DOS/ROM BIOS 重入 (re-entrancy) 警告模式

          BREAK  ---  在任何時候中斷

          13HERE  ---  把 INT 3 指向 Soft-ICE

        ACTION  ---  設定中斷點發生後的動作

  語法: ACTION [INT1 | INT3 | NMI | HERE | int-number]

        int-number --- 任何可用的插斷號碼 (0-FFh) 。只有當自己的中斷點處理
                       程序已取代原插斷向量時才可使用。(參閱 §11.2)

  解說:

        ACTION 指令用來決定當中斷點條件成立時要把控制權交給誰。大部份的狀況
    都是 INT3 或 HERE 。INT3 是在 Soft-ICE 和其它除錯器一起使用時使用;HERE
    則是用來使中斷點條件成立時回到 Soft-ICE 。INT1 和 NMI 則是兩者擇一用在
    無法使用 INT3 的除錯器時。例如:使用 CodeView 時,ACTION 設為 NMI 最好
    。

        只有當自己的中斷點處理程序已取代原插斷向量時才可使用 int-number 。
    如果沒有中斷點處理程序而使用 int-number 將會發生錯誤。參閱 §11.2
    以取得更多資訊。

        如果沒有加任何參數將會顯示目前的設定。

        ACTION 的內定值是 HERE 。

    〔例〕 ACTION HERE
          這道指令設定當中斷點條件成立時將返回 Soft-ICE 。

        WARN  ---  設定 DOS/ROM BIOS 重入 (re-entrancy) 警告模式

  語法: WARN [ON | OFF]

  解說:

        WARN 指令是用來讓 Soft-ICE 和會使用 DOS 或 ROM BIOS 的除錯器一起使
    用。許多除錯器使用 DOS 和 ROM BIOS 來做螢幕輸出和讀取按鍵。因為 DOS 和
    ROM BIOS 不完全能重入,若中斷點發生在 DOS 或 ROM BIOS 在執行時,除錯器
    可能無法正常的工作。

        如果設定 WARN ON 而且 ACTION 不是 HERE ,在真正動作發生前會先把控制
    權交給 Soft-ICE 。系統會顯示目前 CS:IP 並讓你決定是要繼續或是回到 Soft-
    ICE 。一般而言,你應該選擇回到 Soft-ICE 以繼續除錯。只有在你確定不會造
    成 DOS 或 ROM BIOS 重入時才可選擇繼續。

        在 Soft-ICE 和 DEBUG 、SYMDEB 及 CodeView 一起使用時應該把 WARN 設
    為 ON 。

        如果未加參數將會顯示目前 WARN 的狀態。

        WARN 的內定值是 OFF 。

    〔例〕 WARN ON
          這道指令會打開 DOS/ROM BIOS 重入警告模式。

        BREAK  ---  在任何時候中斷

  語法: BREAK [ON | OFF]

  解說:

        BREAK 指令讓你即使在關閉插斷的狀況下也能從當掉的系統叫出 Soft-ICE
    。你可以在整個除錯過程中使用 BREAK 模式或在需要時開關它。

        BREAK 模式會些微的降低系統的效率。系統的效率雖會降低,但卻可以跳出
    當掉的程式。即使效率會降低,若是程式隨時可能會當掉,使用者還是可能會一
    直使用 BREAK 模式。

        不像其它也可以隨時叫出的除錯器,Soft-ICE 不需要外加的開關。當 BREAK
    為 ON 時,只要按熱鍵即可叫出 Soft-ICE 。

        如果沒有加參數將會顯示目前 BREAK 的狀態。

        BREAK 的內定值是 OFF 。

    〔例〕 BREAK ON
          這道指令會打開 BREAK 模式。這意味著即使關閉插斷,Soft-ICE 也可隨
      時叫出。

        13HERE  ---  把 INT 3 指向 Soft-ICE

  語法: 13HERE [ ON | OFF]

  解說:

        13HERE 指令讓你指定所有的 INT 3h 均會叫出 Soft-ICE 的視窗。這項功能
    在你想讓程式停在某特定位置時很有用。

        要使用這項功能,在你的程式碼中你想停下來的位置加上 INT 3 指令。當
    INT 3 發生時會叫出 Soft-ICE 視窗。這時候,你可以使用 R IP 指令來改變指
    令指標指向 INT 3 的下一個程式碼;然後你可以繼續進行除錯。

        如果沒有加參數將會顯示目前 13HERE 的狀態。

        13HERE 的內定值是 OFF 。

    〔例〕 13HERE ON
          這道指令會打開 13HERE 模式。在這之後的所有 INT 3 均會叫出 Soft-
       ICE 視窗。

§5.5 公用指令

      指令:

          A  ---  組譯程式碼

          S  ---  搜尋資料

          F  ---  將資料填入記憶體

          M  ---  搬移資料

          C  ---  比較兩記憶區塊

        A  ---  組譯程式碼

  語法: A [address]

  解說:

        Soft-ICE 的組譯器允許你把程式碼直接組譯進記憶體中。這個組譯器支援基
    本的 8086 程式碼及 80186 、80286 真實定址模式的擴充。但是運算輔助器及
    80386 的特殊程式碼、暫存器定址模式等無法組譯。

        A 指令會進入 Soft-ICE 內建的組譯器。每行前會顯示位址當提示符號。當
    組合語言之程式碼打入並按下 Enter 後,此程式碼會組譯進指定位址的記憶體中
    。程式碼必需符合標準的 Intel 模式。在位址提示符號下按 Enter 會離開組譯
    模式。

        如果你正組譯的記憶體範圍在程式碼窗中是可見的,在你組譯時程式碼會交
    互變化。

        Soft-ICE 的組譯器支援標準的 8086 族指令,不過有些加強:

        * DB 指令用來直接定義記憶體中之位元組資料。DB 指令後接一串位元組資
           料 或/和 由空白、逗號分隔的字串。

        * RETF 代表一個 far return 。

        * WORD PTR 和 BYTE PTR 用來決定資料的大小。如:
             MOV BYTE PTR ES:[1234],1

        * 使用 FAR 和 NEAR 以明確的指定遠程或近程的跳躍或呼叫。如果未指定
           FAR 、NEAR ,一律視為 NEAR 。

        * 參考到記憶體位置的運算域必需放在方括號中。如: MOV AX,[1234] 。

    〔例〕 A CS:1234
          這道指令會提示你輸入組合語言碼並從 CS:1234 開始組譯之。輸入最後一
      道程式碼後在位址提示符號後按 Enter 。

        S  ---  搜尋資料

  語法: S address L lebgth data-list

        data-list --- 一串位元組資料或以逗號、空白分隔的加引號字串。加引號
                      的字串可以使用單引號或雙引號。

        length --- 位元組長度。

  解說:

        S 指令會在記憶體中搜尋和 data-list 相同之位元組或字元。搜尋的動作由
    指定的 address 開始,持續搜尋 length 位元組。每個發現的位址都會顯示出來
    。

    〔例〕 S DS:SI+10 L CX 'Hello',12,34
          這道指令會從目前的資料節段中差距位址為 SI+10 處開始搜尋 Hello 字
      串後接 12h 、13h 的資料。搜尋會持續 CX 位元組才停止。

        H  ---  將資料填入記憶體

  語法: F address L length data-list

        data-list --- 一串位元組資料或以逗號、空白分隔的加引號字串。加引號
                      的字串可以使用單引號或雙引號。

        length --- 位元組長度。

  解說:

        F 指令會用指定的 data-list 來填滿記憶體。填入的動作會從指定的
    address 開始並持續 length 位元組。如果有需要會重覆 data-list 。

    〔例〕 F 8000:0 l 100 'Test'
          這道指令會從 8000:0000 開始填入 100h 位元組的 Test 。Test 字串會
      一直重覆直到填完指定的長度。

        M  ---  搬移資料

  語法: M start-address L length end-address

        length --- 位元組長度。

  解說:

        M 指令會從指定的 start-address 搬移 length 位元組的資料到
    end-address 。

  〔例〕 M 1000:0 L 200 2000:0
        這道指令會從記憶體位址 1000:0000 處搬移 200h 位元組的資料到
    2000:0000 處。

        C  ---  比較兩記憶區塊

  語法: C address1 L length address2

        length --- 位元組長度。

  解說:

        C 指令會拿 address1 處 length 位元組大小的記憶體區塊和 address2 處
    之資料做比較。如果第一塊區塊的值和第二塊的值不同時會顯示兩者各自之值及
    其記憶體位址。

    〔例〕 C 5000:100 L 10 6000:100
          這道指令會比較從記憶體位址 5000:100 開始 10h 位元組之記憶體區塊和
      從 6000:100 開始 10h 位元組的記憶體區塊之值。

小恐龍工作坊 提供