附錄六 SYMDEB.EXE 使用方法

SYMDEB.EXE 是附在 MASM 4.0 的一個除錯程式,雖然名氣不如 DEBUG 大,但是功能卻比 DEBUG 強得多。和 DEBUG 比較,SYMDEB 的新增功能中最重要是,能在除錯時顯示原始程式的變數名、標記名……,不再是很難看懂的位址,所以名之為『符號除錯器』(symbolic debug)。除此之外,即使不使用上述功能,它還加強了許多 DEBUG 命令,例如顯示 IEEE 格式實數、中斷點的設定等等。

底下小木偶就如何在除錯時顯示原始碼的符號名以及加強的指令來說明。


在除錯時顯示變數名

SYMDEB 的所謂『符號』指的是變數名、標記名和副程式名三種,SYMDEB 可以在除錯階段以原始碼所定義的名稱顯示這三種名稱,而不必再使用位址,因此大大的增加了方便性與可讀性。為了達到這個目的,必須把這些名稱都寫進一個稱為『符號檔』的檔案堙A這個符號檔的副檔名固定是 *.SYM,建立的方法有兩種。

第一種是方法的過程如下,共有三個步驟:

  1. 在撰寫原始程式時,要顯示的符號必須宣告為『public』。
  2. 連結時加上『/MAP』參數,製造出 *.MAP 檔。
  3. 用 MASM 4.0 所附的另一個公用程式,MAPSYM.EXE,從 *.MAP 檔製造 *.SYM 檔。(註一)

小木偶舉個例子吧,就以第 22 章的 FPU2.ASM 為例子。首先得稍稍修改把要在除錯階段的符號宣告成『public』:

;***************************************
code    segment
        assume  cs:code,ds:code
        org     100h
        public  n1,n2,begin
;---------------------------------------
start:  jmp     short begin
n1      dd      10.25
n2      dd      2.33
sum     dd      ?
begin:  finit           ;  st   ; st(1)
        fld     n1      ; 10.25 ;
        fld     n2      ;  2.33 ; 10.25
        fadd            ; 12.58
        fstp    sum
        int     20h
;---------------------------------------
code    ends
;***************************************
        end     start

接下來照下面方法製造出 FPU2.SYM 及可執行檔 FPU2.COM:

H:\HomePage\SOURCE>path e:\asm;%path% [Enter] →設定路徑

H:\HomePage\SOURCE>masm fpu2; [Enter]
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987.  All rights reserved.


  51590 + 365354 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors

H:\HomePage\SOURCE>link fpu2 [Enter]

Microsoft (R) Personal Computer Linker  Version 2.40
Copyright (C) Microsoft Corp 1983, 1984, 1985.  All rights reserved.

Run File [FPU2.EXE]: [Enter]
List File [NUL.MAP]: fpu2 /map [Enter]  → 製造 MAP 檔
Libraries [.LIB]: [Enter]
Warning: no stack segment

H:\HomePage\SOURCE>exe2bin fpu2 fpu2.com [Enter]

H:\HomePage\SOURCE>mapsym fpu2 [Enter]  → 製造 SYM 檔
Microsoft (R) Symbol File Generator  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.

        Program entry point at 0000:0100  →不顯示符號名

H:\HomePage\SOURCE>

到此,已經把所有除錯必備的檔案,FPU2.COM 以及 FPU2.SYM,都製造好了,接下來就要使 SYMDEB 載入符號檔及可執行檔,方法如下:(註二)

H:\HomePage\SOURCE>symdeb fpu2.sym fpu2.com [Enter]   →先載入符號檔再載入可執行檔
Microsoft (R) Symbolic Debug Utility  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.

Processor is [80286]
-u [Enter]
2205:0100 EB0C           JMP    BEGIN   →顯示標記名
CODE:N1:   →顯示變數名
2205:0102 0000           ADD    [BX+SI],AL
2205:0104 2441           AND    AL,41                         ;'A'
CODE:N2:   →顯示變數名
2205:0106 B81E15         MOV    AX,151E
2205:0109 40             INC    AX
2205:010A 0000           ADD    [BX+SI],AL
-t [Enter]
AX=0000  BX=0000  CX=0025  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=2205  ES=2205  SS=2205  CS=2205  IP=010E   NV UP EI PL NZ NA PO NC
CODE:BEGIN:  →顯示區段名及標記名
2205:010E 9B             WAIT
-t [Enter]
AX=0000  BX=0000  CX=0025  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=2205  ES=2205  SS=2205  CS=2205  IP=010F   NV UP EI PL NZ NA PO NC
2205:010F DBE3           FINIT
-t [Enter]
AX=0000  BX=0000  CX=0025  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=2205  ES=2205  SS=2205  CS=2205  IP=0111   NV UP EI PL NZ NA PO NC
2205:0111 9B             WAIT
-t [Enter]
AX=0000  BX=0000  CX=0025  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=2205  ES=2205  SS=2205  CS=2205  IP=0112   NV UP EI PL NZ NA PO NC
2205:0112 D9060201       FLD    DWord Ptr [N1]                 DS:0102=0000
-ds n1 [Enter] →也可以變數名輸入
2205:0102  00 00 24 41  +0.1025E+2

第二種方法是組譯時,加上『/ZD』或『/ZI』參數,強迫 MASM 5.0 把所有符號資料存入目的檔中,連結時也得以『/MAP』參數造出 *.MAP 檔,除錯時一如前面。

底下介紹 SYMDEB 的指令。


SYMDEB 的指令

在介紹 SYMDEB 的指令前,先說明 SYMDEB 的一般規則。首先,SYMDEB 是不分大小寫的,換句話說,SYMDEB 中大寫和小寫是一樣的,而且數值只能以十六進位輸入或輸出,這兩點和 DEBUG 相同。

第二,在 SYMDEB 堙A位址的表示法是以 XXXX:YYYY 的方式表示,而區段有時可以省略,省略時通常 SYMDEB 會以 DS 為內定值,但是如果是和程式碼有關的指令,例如 A 指令、U 指令等會以 CS 為內定值。區段位址與偏移位址,都可以用符號名代替。

第三,有時要指定範圍時,例如用 D 指令使某一個記憶體範圍的資料顯示在螢幕上時,可以用兩種方法表示,第一種是以『起始位址 結束位址』表示,第二種是以『起始位址 L長度』表示。例如:

DS:0100 1FF
0000:400 LA0

SYMDEB 的指令共有 33 個,其中有些與 DEBUG 完全相同,我在下表的 DEBUG 欄內標示『同』﹔有些是新增的,我標示為『』﹔有些是 DEBUG 堣]有但是 SYMDEB 堨[強了此指令的功能,我標示為『+』。下表就是 SYMDEB 的完整指令列表:

指令名功能 與 DEBUG
比較
A(assemble) 輸入組合語言程式 +
B(break) 中斷點指令群
C(compare) 比較兩段記憶體內容
D(dump) 傾印記憶體內容 +
E(enter) 輸入資料+
F(fill) 填入資料
G(go) 執行程式
H(hex) 求兩十六進位數之和與差
I(input) 由周邊輸入
K(stack trace) 追蹤堆疊
L(load) 載入檔案或磁區
M(move) 移動資料
N(name) 輸入 FCB 檔名
O(output) 周邊輸出
P(proc trace) 把副程式或中斷為單位的追蹤
Q(quit) 結束 SYMDEB.EXE
R(register) 顯示暫存器數值
S(search) 搜尋資料 +
T(trace) 單步追蹤+
U(unassemble) 反組譯+
V(view) 顯示原始指令
W(write) 寫入磁片
X(exam symbol map) 檢視符號檔
XO(open symbol map) 開啟新的符號檔
Z(set symbol value) 設定符號位址
?(help) 線上說明
!(shell) 執行 DOS 指令
.(current line) 顯示目前的原始指令
<{ 輸入轉向
>} 輸出轉向
=~ 輸出入轉向
* 加註解

Assemble:寫 x86/x87 指令

A 指令和 DEBUG 幾乎相同,但是可以使用 8087、80286、80287 指令,但不能使用 80286 保護模式指令,也不支援 MMX 指令。參考第三章

Break Point:中斷點指令群

這個指令包含五個子指令,BP、BC、BD、BE、BL。

BP 指令可以在某個位址、標記設定中斷點,當 SYMDEB 執行到這個中斷點時會停下來,顯示所有暫存器、旗標,中斷點的設定必須是指令的起始位址才有效,設定後除非是清除,否則都會一直保持。這個功能對於追蹤分枝很有用。BP 指令的使用方法如下:

BP[n] ADDRESS [次數] ["COMMAND"]

n 表示中斷點號碼,可以從 0 到 9 共十個號碼,SYMDEB 可以設定 10 個中斷點,您可以指定號碼,也可以不指定,如果不指定的話就由 SYMDEB 由 0 開始依次加上去,如果指定號碼的話,號碼和『BP』之間不可以有空格。ADDRESS 表示所設定的中斷點位址,也可用標記表示。次數是指該中斷點不立即生效,必須執行過所指定的次數之後才生效,這個方法在偵測迴圈時特別有用。COMMAND 是指當執行到中斷點時,不僅停止執行顯示暫存器外,還要執行『"』之間的 SYMDEB 指令,如果後續要執行的指令不只一個,可用『;』分開。

BC 是用來清除中斷點,其指令格式是

BC n

當指定 n 時表示清除那一個中斷點號碼,如果 n 為『*』表示清除所有的中斷點。當中斷點被清除後,SYMDEB 執行到此處就不會停下來了。

BD 是用來暫時使中斷點失去功能,但不是真正清除,可以用 BE 來使它恢復功能,BD、BE 的使用格式和 BC 相同。( D 和 E 其實分別是 disable 和 enable 之意 )

BL 是把所有的中斷點列出來,第一欄是中斷點號碼,第二欄是是否失去功能或正常(生去功能則顯示『d』﹔正常則顯示『e』),第三欄是中斷點位址,第四欄是該中斷點位址的標記名,第五欄是還要通過幾次才生效,第六欄是最初設定時的可通行次數,第七欄是中斷點中斷後的後繼動作。底下看看一些例子:

h:\homepage\source>e:symdeb fpu2.sym fpu2.com [Enter]
Microsoft (R) Symbolic Debug Utility  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.

Processor is [80286]
-u begin 123 [Enter] →先觀察程式碼
CODE:BEGIN:
211C:010E 9B             WAIT
211C:010F DBE3           FINIT
211C:0111 9B             WAIT
211C:0112 D9060201       FLD    DWord Ptr [N1]
211C:0116 9B             WAIT
211C:0117 D9060601       FLD    DWord Ptr [N2]
211C:011B 9B             WAIT
211C:011C DEC1           FADDP  ST(1),ST
211C:011E 9B             WAIT
211C:011F D91E0A01       FSTP   DWord Ptr [N2+04 (010A)]
211C:0123 CD20           INT    20
-bp 117 [Enter] →於 CS:0117 處,設定 0 號中斷點
-bp 11C 5 [Enter] →於 CS:011C 處,設定 1 號中斷點,但第 6 次通過時才生效
-bp4 11e [Enter] →於 CS:011E 處,設定 4 號中斷點
-bl [Enter] →列出所有中斷點
0 e 211C:0117 [CODE:BEGIN+09 (0117)]
1 e 211C:011C [CODE:BEGIN+0E (011C)] 0005 (0005)
4 e 211C:011E [CODE:BEGIN+10 (011E)]
-g [Enter] →執行
AX=0000  BX=0000  CX=0025  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=211C  ES=211C  SS=211C  CS=211C  IP=0117   NV UP EI PL NZ NA PO NC
211C:0117 D9060601       FLD    DWord Ptr [N2]            ;BR0 DS:0106=1EB8
→結果到 0 號中斷點就停下來了
-bc 4 [Enter] →清除 4 號中斷點
-g [Enter] →執行

Program terminated normally (0) →因 4 號中斷點已清除,而 1 號中斷點必須通過 5 次
                                      才生效,所以遇不到有效的中斷點,執行到程式結束

Compare:比較記憶體內容

C 指令是用來比較兩段記憶體的內容,其語法是:

C 第一個記憶體起始位址 L長度 第二個記憶體起始位址

記憶體起始位址可以用 XXXX:YYYY 的方式表示,也可以用段暫存器表示 XXXX,如果省略 XXXX 則內定區段是 DS 所指的區段。必較結果是以

第一個位址  數值1  數值2  第二個位址

的方式表示,數值 1 是第一個位址的數值,數值 2 是第二個位址的數值,比較後 SYMDEB 只把不同的數值顯示在螢光幕上。參考以下例子:

-c 100 L10 200 [Enter]
211C:0100  EB  00  211C:0200
211C:0101  0C  00  211C:0201
211C:0104  24  00  211C:0204
211C:0105  41  00  211C:0205
211C:0106  B8  00  211C:0206
211C:0107  1E  00  211C:0207
211C:0108  15  00  211C:0208
211C:0109  40  00  211C:0209
211C:010E  9B  00  211C:020E
211C:010F  DB  00  211C:020F

這個例子是比較 DS:0100 開始的 10 個位元組和 DS:0200 開始的 10 個位元組,當然必須相同長度才比較,所以第二個位址的範圍不須指定。比較結果 DS:0100 數值是 EB,而 DS:0200 是 00,不同才列出,而 DS:0102,DS:0103 和 DS:0202,DS:0203 相同所以沒列出來。

Dump:印出記憶體之內容

D 指令可以把記憶體內容以 ASCII 字串、位元組、字組、雙字組、短實數、長實數、暫時實數的資料形態頃印於螢幕上。其語法是

Dx 起始位址 結束位址
Dx 起始位址 L長度

其中 x 是所選擇的資料形態,x 可以是 A、B、W、D、S、L、T,分別表示 ASCII 字串、位元組、字組、雙字組、短實數、長實數、暫時實數等七種資料形態。也可以不指定資料形態,就是使 x 空白,這時 SYMDEB 就以上次的資料形態方式顯示於螢幕,如果是第一次,就以位元組的方式印出來。

也可以省略結束位址或『L長度』,這時 SYMDEB 會自動印出 128 個位元組資長度就停止,如果是以實數形態列印,則只印出一個實數長度。以下是實例:

h:\homepage\source>e:symdeb fpu2.sym fpu2.com [Enter]
Microsoft (R) Symbolic Debug Utility  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.

Processor is [80286]
-da 100 L10 [Enter]
211C:0100  k...$A8..@.....[
-db n1 l4 [Enter]
211C:0100        00 00 24 41                                  ..$A
-dw begin L10 [Enter]
211C:010E  DB9B 9BE3 06D9 0102 D99B 0606 9B01 C1DE
211C:011E  D99B 0A1E CD01 2620 1501 F8E2 EB58 07E7
-dd n1 L2 [Enter]
211C:0102  4124:0000 4015:1EB8
-ds n1 L2 [Enter]
211C:0102  00 00 24 41  +0.1025E+2
211C:0106  B8 1E 15 40  +0.2329999923706055E+1
-dl n1 [Enter]
211C:0102  00 00 24 41 B8 1E 15 40  +0.5279999749967828E+1
-dt 102 [Enter]
211C:0102  00 00 24 41 B8 1E 15 40 00 00  +0.0E+0

Enter:輸入資料到記憶體內

可以輸入 ASCII 字串、位元組、字組、雙字組、短實數、長實數、暫時實數等七種資料形態,指定方式如同 D 指令,分別是 EA、EB、EW、ED、ES、EL、ET,其語法格式為

Ex 位址 [資料]

x 表示輸入的資料形態,省略時沿用上一次的資料形態。位址可用標記名,也可指定區段,或使用區段暫存器。如果指定資料,則就只能輸入該筆資料﹔如果不指定資料,可以連續輸入數筆資料,每次輸入資料時,SYMDEB 會將記憶體原有的內容顯示出來,再等待您輸入。要注意的是在 EB 輸入完資料後,還要輸入下一筆要按空白鍵才能再輸入其他資料,其他指令則按 Enter 鍵。假如要停止輸入,在 SYMDEB 顯示原有內容時,不輸入任何資料直接按 Enter 鍵,就能停止輸入。請看例子:

-eb 100 [Enter]
2104:0100  00.ff   00.fe   00.[Enter]
-eb 108 3 [Enter]
-ea 110 "Happy" [Enter]
-ew 120 [Enter]
2104:0120  0000.aa00 [Enter]
2104:0122  0000.3344 [Enter]
2104:0124  0000.[Enter]
-ew 128 ffee [Enter]
2104:012A  0000.abcd [Enter]
2104:012C  0000.[Enter]
-es 130 [Enter]
2104:0130  +0.9181027278563336E-40       100E3 [Enter]
2104:0134  +0.0E+0                       1.234 [Enter]
2104:0138  +0.0E+0[Enter]
-el 140 9876.54321 [Enter]
-et 150 9876.54321 [Enter]
-db 100 15f [Enter]
2104:0100  FF FE 00 00 00 00 00 00-03 00 00 00 00 00 00 00  .~..............
2104:0110  48 61 70 70 79 00 00 00-00 00 00 00 00 00 00 00  Happy...........
2104:0120  00 AA 44 33 00 00 00 00-EE FF CD AB 00 00 00 00  .*D3....n.M+....
2104:0130  00 50 C3 47 B6 F3 9D 3F-00 00 00 00 00 00 00 00  .PCG6s.?........
2104:0140  6E C0 E7 87 45 4A C3 40-00 00 00 00 00 00 00 00  n@g.EJC@........
2104:0150  CE 70 03 3E 3F 2C 52 9A-0C 40 00 00 00 00 00 00  Np.>?,R..@......

Fill:填入資料

這個指令是用來把資料填入一塊記憶體內。它只能用位元組的資料形態填入,使用方法是

F 起始位址 L長度 資料
F 起始位址 結束位址 資料

請看例子

-f 100 L6 dd [Enter]
-f 110 118 cc [Enter]
-db 100 L20 [Enter]
2104:0100  DD DD DD DD DD DD 00 00-00 00 00 00 00 00 00 00  ]]]]]]..........
2104:0110  CC CC CC CC CC CC CC CC-CC 00 00 00 00 00 00 00  LLLLLLLLL.......

Go:執行

G 指令是用來執行所除錯的程式,其語法是:

G[=起始位址] [中斷點位址1] [中斷點位址2]……

起始位址是 G 指令開始執行的位址,必須設在某一條指令的開始處,否則很容易當機,也可以用標記名代替起始位址,如果沒有設定,那 SYMDEB 會從 CS:IP 所指的位址開始執行。事實上,當 SYMDEB 載入要偵錯的程式時,會自動的把 CS:IP 指向該程式的進入點,所以常常省略起始位址。

中斷點位址是指 G 指令執行到這些位址,就會停下來,顯示暫存器及旗標值,最多可以設定十個中斷點,但是 G 指令完成後,這些中斷點就被清除了,這點和 BP 指令所設定的中斷點不同。中斷點的設定對偵測程式的分支很有用。如果不設定中斷點,那程式就會一直執行到程式結束。

SYMDEB 之所以能中斷執行的原因是,它會偷偷地把中斷點所在的位址換成中斷 CCH,然後在設定 INT CCH 副程式,所以當成是執行到中斷點時,實際上是被轉向到中斷 CCH。而中斷 CCH 顯然是印出各暫存器及旗標之值。例如:

H:\HomePage\SOURCE>symdeb fpu2.sym fpu2.com [Enter]
Microsoft (R) Symbolic Debug Utility  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.

Processor is [80286]
-g=begin 117 [Enter] →由 BEGIN 開始執行到位址 CS:0117
AX=0000  BX=0000  CX=0025  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1422  ES=1422  SS=1422  CS=1422  IP=0117   NV UP EI PL NZ NA PO NC
1422:0117 D9060601       FLD    DWord Ptr [N2]                 DS:0106=1EB8
 → 執行到 CS:0117 中斷了

Hex:計算兩數之和與差

此指令只能以十六進位表示,語法是

H 數值1 數值2

其減法是數值 1 減數值 2,例如:

-h 100 300 [Enter]
0400  FE00

Input:顯示輸入埠

Stack Trace:顯示堆疊內容

Load:載入檔案或磁區到記憶體

如果要載入磁區,其語法是:

L 載入位址 磁碟機名 起始磁區 磁區數

如果要載入檔案,必須先用 N 指令命名,然後直接輸入

L

即可。

Move:搬移記憶體資料

語法是:

M 起始位址 L長度 目的位址
M 起始位址 結束位址 目的位址

要搬移的記憶體範圍,可以用兩種方式表示。第一種由起始位址搬移以『L』指定的長度到目的位址,此長度是以位元組為單位。第二種是由起始位址到結束位址搬移到目的位址。不管那一種方式,搬移後援來的記憶體內容不變。例如:

-d 100 l10 [Enter]
1422:0100  EB 0C 00 00 24 41 B8 1E-15 40 00 00 00 00 9B DB  k...$A8..@.....[
→觀察要搬移位址之內容
-d 200 l10 [Enter]
1422:0200  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
→觀察目的位址之內容
-m 100 l5 200 [Enter]  →以長度方式搬移
-m 10a 10f 20a [Enter]  →以起始到結束方式搬移
-d 200 l10 [Enter]
1422:0200  EB 0C 00 00 24 00 00 00-00 00 00 00 00 00 9B DB  k...$..........[
→觀察搬移後之內容

Name:設定檔名

其語法是

N 路徑名\檔名

Output:將資料輸出至某一 IO 埠

Proc Trace:把副程式當成一個指令

P 指令和 T 指令相同,用來追蹤程式之執行,其中的差別在 P 指令如果遇到 CALL 或是 INT 指令,則直接執行全部的副程式或中斷裡面的指令而到下一個指令;但是 T 指令則是一步一步的追蹤。這樣的好處是,副程式或中斷服務程式應該不會出錯,所以可以不用追蹤,簡化追蹤過程。P 指令的完整用法是:

P[=起始位址] [指令個數]

如果省略起始位址,則由現在 CS:IP 處開始執行,如果省略指令個數,指執行一個指令。

Quit:結束 SYMDEB

用法是:

Q

沒有其他參數。

Register:顯示或更改暫存器之值

用法是:

R [暫存器 [數值]]

如果省略暫存器,那 SYMDEB 會把所有暫存器以及旗標之值顯示出來,如果不省略暫存器,那 SYMDEB 會顯示該暫存器的數值,並以冒號提示您輸入新的數值更換原暫存器數值,如果數值也不省略,SYMDEB 不會出現提示,直接修改成該數值。

-r [Enter]
AX=0000  BX=0000  CX=0000  DX=0000  SP=EAE5  BP=0000  SI=0000  DI=0000
DS=140A  ES=140A  SS=140A  CS=140A  IP=0100   NV UP EI PL NZ NA PO NC
140A:0100 01D8           ADD    AX,BX
-r ax 400 [Enter]
-r bx [Enter]
BX 0000
:800 [Enter]
-r [Enter]
AX=0400  BX=0800  CX=0000  DX=0000  SP=EAE5  BP=0000  SI=0000  DI=0000
DS=140A  ES=140A  SS=140A  CS=140A  IP=0100   NV UP EI PL NZ NA PO NC
140A:0100 01D8           ADD    AX,BX

Search:搜尋

在指定的記憶體範圍搜尋字串或數字列,用法是:

S 起始位址 結束位址 字串或數列
S 起始位址 L長度 字串或數列

起始位址可以用標記或 XXXX:YYYY 表示,亦可用偏移位址表示,當指用偏移位址時,SYMDEB 會自動搜尋 DS 所指的區段位址,至於搜尋到那一個範圍可以用結束位址,或搜尋長度表示,如果用結束位址則不能跨越其他區段,所以不須表示區段位址,如果用搜尋長度則需用『L』表示出來。

要搜尋的數值如果不只一個,則以空白分隔,而且必須是 00H 到 0FFH 之間的數。如果要搜尋字串,必須用『"』括起來。S 指令所找到的資料會以 XXXX:YYYY 的方式顯示在螢幕,如果沒找到,就不顯示直接顯示 SYMDEB 的提示符號,等待使用者輸入下一個指令。例如:

-s f000:e000 f000 "IBM" [Enter]
F000:E00E
-s f000:e000 f000 41 54 [Enter]
F000:E012
-r ds f000 [Enter]
-s f000 L1000 "PATCH" [Enter]
F000:FF62
F000:FF8A
F000:FFB2

Trace:單步追蹤

這個指令每次指執行一道 CPU 指令,而後把執行後的暫存器以及旗標內容顯示於螢光幕上,讓您觀察程式是否依您的設計正確執行,同時使 CS:IP 指向下一個 CPU 指令。它的用法是:

T [=起始位址] [指令個數]

T 指令也可以設定由那一個位址開始執行,或要執行幾個指令。如果沒有指定起始位址(在偵錯時,用得最多),會從 CS:IP 現在的位址開始執行。例如:

H:\HomePage\SOURCE>symdeb fpu2.sym fpu2.com [Enter]
Microsoft (R) Symbolic Debug Utility  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.

Processor is [80286]
-t [Enter]
AX=0000  BX=0000  CX=0025  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1422  ES=1422  SS=1422  CS=1422  IP=010E   NV UP EI PL NZ NA PO NC
CODE:BEGIN:
1422:010E 9B             WAIT
-t 3 [Enter]
AX=0000  BX=0000  CX=0025  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1422  ES=1422  SS=1422  CS=1422  IP=010F   NV UP EI PL NZ NA PO NC
1422:010F DBE3           FINIT
AX=0000  BX=0000  CX=0025  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1422  ES=1422  SS=1422  CS=1422  IP=0111   NV UP EI PL NZ NA PO NC
1422:0111 9B             WAIT
AX=0000  BX=0000  CX=0025  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1422  ES=1422  SS=1422  CS=1422  IP=0112   NV UP EI PL NZ NA PO NC
1422:0112 D9060201       FLD    DWord Ptr [N1]                 DS:0102=0000

再看第二個例子:


此外 SYMDEB 的 T 指令和 DEBUG 有些不同的地方。第一,SYMDEB 的 T 指令不對 INT 21H 做追蹤,大概是微軟認為 INT 21H 不會有錯誤吧,如果您想觀察 INT 21H 的執行情形,只好回去用 DEBUG。第二,可以追蹤 BIOS 內容。第三,可以配合微軟所出品的高階語言編譯器除錯。

Unassemble:反組譯

這個指令是用來把機械碼反組譯變成助記憶碼,用法是:

U [起始位址 [結束位址或L長度]]
h:\homepage\source>symdeb fpu2.sym fpu2.com [Enter]
Microsoft (R) Symbolic Debug Utility  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.

Processor is [80286]
-u [Enter]
211F:0100 EB0C           JMP    BEGIN
CODE:N1:
211F:0102 0000           ADD    [BX+SI],AL
211F:0104 2441           AND    AL,41                         ;'A'
CODE:N2:
211F:0106 B81E15         MOV    AX,151E
211F:0109 40             INC    AX
211F:010A 0000           ADD    [BX+SI],AL
-u begin L4 [Enter]
CODE:BEGIN:
211F:010E 9B             WAIT
211F:010F DBE3           FINIT
211F:0111 9B             WAIT

View:顯示高階語言之原始程式與相對應之機械碼。

其語法是:

V 起始位址

Write:寫入磁片或檔案

Exam:列出符號檔內容

語法是

X [*]
X? [符號檔名!]

這個指令可以用『X *』觀看已經由 SYMDEB 載入的符號檔,或是用『X?』來觀看在磁碟上的符號檔內容。

Open map:開啟符號檔

用法是

XO [符號檔名!]

Symbol Set:設定符號(變數)值

用法是

Z 符號 數值

這個指令可以設定變數值。

?:線上求助

-? [Enter]
A [<address>] - assemble              M <range> <address> - move
BC[<bp>] - clear breakpoint(s)        N <filename> [<filename>...] - name
BD[<bp>] - disable breakpoint(s)      O <value> <byte> - output to port
BE[<bp>] - enable breakpoint(s)       P [=<address>] [<value>] - program step
BL[<bp>] - list breakpoint(s)         Q - quit
BP [bp] <address> - set breakpoint    R [<reg>] [[=] <value>] - register
C <range> <address> - compare         S <range> <list> - search
D[type][<range>] - dump memory        S {-|&|+} - source level debugging
E[type] <address> [<list>] - enter    T [=<address>] [<value>] - trace
F <range> <list> - fill               U [<range>] - unassemble
G [=<address> [<address>...]] - go    V [<range>] - view source lines
H <value> <value> - hexadd            W [<address> [<drive><rec><rec>]] - write
I <value> - input from port           X [?] <symbol> - examine symbols(s)
K [<value>] - stack trace             XO<symbol> - open map/segment
L [<addr> [<drive><rec><rec>]] - load Z <symbol> <value>

? <expr> - display expression         > } <device/file> - Redirect output
! [dos command] - shell escape        < { <device/file> - Redirect input
. - display current source line       = ~ <device/file> - Redirect both
\ - screen flip                       * <string> - comment

<expr> ops: + - * / : not seg off by wo dw poi port wport mod and xor or
<type> : Byte, Word, Doubleword, Asciz, Shortreal, Longreal, Tenbytereal
-

Shell:執行 DOS 指令

! DOS指令

可以執行 DOS 指令,例如

-! dir m*.exe [Enter]

 Volume in drive E is UTILITY
 Volume Serial Number is 114B-0D05
 Directory of E:\ASM

MAPSYM   EXE        18,026  10-16-85   4:00 MAPSYM.EXE
MASM     EXE       103,175  07-31-87   0:00 MASM.EXE
         2 file(s)        121,201 bytes
         0 dir(s)      50,827,264 bytes free

-

.:顯示目前行號

這個指令的語法是:

.

但是無法在組合語言中使用,只能在微軟的高階語言中使用。

轉向

>、< 是指 SYMDEB 的轉向符號,前者是輸出轉向,後者是輸入轉向,它們後面可以接檔名或設備名,設備名可以是控制台 ( 用 con 表示 ) 或印表機 ( 以 prn 表示 )。一般而言,SYMDEB 會把資料輸出至螢幕,讓程式設計師觀察程式那兒出了錯誤,但是有時會想要把資料輸出至檔案,這時候就可以用 >,迫使 SYMDEB 把 資料填入某個檔案。讓小木偶以 TRACE.ASM ( 其內容見附錄八 ) 做示範:

H:\HomePage\SOURCE>symdeb trace.com [Enter] →用 SYMDEB 載入 TRACE.COM
Microsoft (R) Symbolic Debug Utility  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.

Processor is [80286]
-dt 100 [Enter] →先使 DT 指令顯示於螢光幕上 ( 事實上 SYMDEB 內定輸出就是螢光幕 )
0EB4:0100  1C C8 C4 F7 0F 33 45 CA F8 3F  +0.123456E-1
->e:\trace.txt [Enter] →使 SYMDEB 的訊息輸出至 E:\TRACE.TXT
 -   →※此時,還對 SYMDEB 下了許多指令,請看下面的說明
-q [Enter]

H:\HomePage\SOURCE>type e:\trace.txt [Enter] →返回 DOS 後,檢視 E:\TRACE.TXT 檔案的內容
 -dt 100
0EB4:0100  1C C8 C4 F7 0F 33 45 CA F8 3F  +0.123456E-1
->con

H:\HomePage\SOURCE>

在上面標有『※』的地方,事實上小木偶還對 SYMDEB 下了兩道指令,『dt 100』和『>con』,但是因為之前已經使 SYMDEB 的訊息轉向輸出到 E:\TRACE.TXT 檔案堙A所以不會顯示在控制台的螢光幕上,反而是被保存在 E:\TRACE.TXT 堙C第二個指令,『>con』是讓 SYMDEB 的輸出再度轉回到控制台 ( console ) 的螢光幕上,然後再輸入『q』指令,SYMDEB 就會把訊息再度顯示在螢光幕上了。

『}』、『{』這兩個輸出、輸入轉向指令是指對 SYMDEB 所除錯的程式,做輸出輸入的轉向,而 SYMDEB 本身的輸出、輸入仍不受影響。例如用 SYMDEB 對下面的程式,PNT_STR.ASM,除錯:

				        page    ,132 
                            ;*************************************** 
 0000                       code    segment 
                            assume  cs:code,ds:code 
 0100                               org     100h 
                            ;--------------------------------------- 
 0100  EB 1E                start:  jmp     short begin 
 0102  48 65 6C 6C 6F 77 2C	string  db      'Hellow, I learn assembly now.$' 
       20 49 20 6C 65 61 72
       6E 20 61 73 73 65 6D	
       62 6C 79 20 6E 6F 77	
       2E 24
 0120  B4 09                begin:  mov     ah,9 
 0122  BA 0102 R                    mov     dx,offset string 
 0125  CD 21                        int     21h 
 0127  CD 20                        int     20h 
                            ;--------------------------------------- 
 0129                       code    ends 
                            ;*************************************** 
                            end     start

使 PNT_STR.ASM 組譯、連結並轉換成 PNT_STR.COM 後,用 SYMDEB 載入:

H:\HomePage\SOURCE>symdeb pnt_str.com [Enter]
Microsoft (R) Symbolic Debug Utility  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.

Processor is [80286]
-g [Enter] →這次沒有輸出轉向
Hellow, I learn assembly now.
Program terminated normally (0)
-q [Enter]

H:\HomePage\SOURCE>symdeb pnt_str.com [Enter]
Microsoft (R) Symbolic Debug Utility  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.

Processor is [80286]
-}e:\pnt_str.txt [Enter] →使被除錯的程式,PNT_STR.COM,的資料轉向輸出到 E:\PNT_STR.TXT 檔案
-g125 [Enter] →但是 SYMDEB 本身所產生的訊息,如『t』、『g』指令,仍輸出到控制台
AX=0900  BX=0000  CX=0029  DX=0102  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=0EB8  ES=0EB8  SS=0EB8  CS=0EB8  IP=0125   NV UP EI PL NZ NA PO NC
0EB8:0125 CD21           INT    21  ;Display String
-t [Enter]
AX=0924  BX=0000  CX=0029  DX=0102  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=0EB8  ES=0EB8  SS=0EB8  CS=0EB8  IP=0127   NV UP EI PL NZ NA PO NC
0EB8:0127 CD20           INT    20
-g [Enter]

Program terminated normally (0)
-q [Enter]

E:\HomePage\SOURCE>type e:\pnt_str.txt [Enter] →檢查『}』指令,使PNT_STR 轉向至 PNT_STR.TXT
 Hellow, I learn assembly now.
E:\HomePage\SOURCE>

*:註解

這個指令是在 * 後加上註解,例如:

-* FPU debug [Enter]
 FPU debug
-

註一:MAPSYM.EXE 的語法是

MAPSYM [/L] MAP檔名

MAPSYM 只有一個參數,/L,加上 /L 表示把變數名顯示在螢幕上,不加 /L 表示不顯示。MAP 檔名可以省略副檔名也可以寫出來。

註二:SYMDEB 的完整語法是

SYMDEB [參數] [SYM檔] [欲除錯之可執行檔] [該可執行檔之參數]

SYMDEB 的參數有 5 個。

  1. /IBM:也可簡寫成『/I』,這個參數會強迫 SYMDEB 把 IBM PC 的相容機種當成 IBM PC 使用。
  2. /K:這個參數可以使鍵盤的『Scroll Lock』或『Break』鍵當作中斷鍵使用。
  3. /N:這個參數使非 IBM PC 但是執行 MS DOS 的機種發揮硬體中斷功能。
  4. /S:可以使 SYMDEB 在除錯畫面與執行畫面之間切換,對於圖形畫面很有用。
  5. /"指令":『"』之間為 SYMDEB 指令,它可以指定 SYMDEB 一啟動就要執行的指令。