DEBUG的基本命令的使用
DEBUG是專門為匯編語言設計的一種調試工具,它通過步進,設置斷點等方式為匯編語言程序員提供了非常有效的調試手段。
DEBUG的命令都是一個字母,后跟一個或多個參數:字母 [參數]
命令的使用中注意:
① 字母不分大小寫;
② 只使用16進制數,沒有后綴字母;
③ 分隔符(空格或逗號)只在兩個數值之間是必須的,命令和參數間可無分隔符;
④ 每個命令只有按了回車鍵后才有效,可以用Ctrl+Break中止命令的執行;
⑤ 命令如果不符合Debug的規則,則將以“error”提示,並用“^”指示錯誤位置。
許多命令的參數是主存邏輯地址,形式是“段基地址 : 偏移地址”。其中,段基地址可以是段寄存器或數值;偏移地址是數值。如果不輸入段地址,則采用默認值,可以是缺省段寄存器值。如果沒有提供偏移地址,則通常就是當前偏移地址。
對主存操作的命令還支持地址范圍這種參數,它的形式是:“開始地址 結束地址”(結束地址不能具有段地址),或者是:“開始地址 L字節長度”。
DEBUG命令一覽:
分類 |
命令格式 |
功能簡介 |
讀寫寄存器 |
R |
顯示所有寄存器的當前內容 |
R寄存器名 |
顯示和修改指定寄存器內容 |
|
RF |
顯示和修改標志寄存器內容 |
|
匯編和反匯編 |
A[內存地址] |
從指定地址開始匯編指令 |
U[內存塊] |
對指定內存塊進行反匯編 |
|
執行指令 |
T[:內存地址][條數] |
單步或多步執行指令(進入過程) |
P[=內存地址][條數] |
單步或多步執行指令(不進入過程) |
|
G[=內存地址] |
連續執行指令 |
|
G[=內存地址]斷點地址 |
設斷點執行程序 |
|
讀寫內存 |
D[內存塊] |
顯示指定內存塊內容 |
E 內存地址 字符或數值串 |
修改指定內存內容 |
|
F 內存塊 字符或數值串 |
填充指定內存塊 |
|
S 內存塊 字符串或數值 |
在指定內存塊中查找串 |
|
M 內存塊1 內存塊2的首地址 |
復制內存塊內容 |
|
C 內存塊1 內存塊2的首地址 |
比較兩個指定內存塊 |
|
讀寫磁盤 |
N[d:][path]文件名.擴展名 |
指定欲讀寫的磁盤文件 |
W 內存地址 |
將指定內存塊寫入文件 |
|
L [內存地址] |
將文件調入內存 |
|
讀寫I/O端口 |
I 端口地址 |
讀入指定端口的內容 |
O 端口地址 數值 |
將數據寫入指定端口 |
|
十六進制加減 |
H 數值1 數值2 |
計算並顯示兩數之和,兩數之差 |
退出DEBUG |
Q |
退出DEBUG,返回DOS |
1、DEBUG程序的啟動
在DOS提示符下,可鍵入命令:
C:\>DEBUG↙
DEBUG命令的完整格式為:DEBUG [d:][path][文件名][ 參數1][參數2]。其中[d:]是盤符,[path]是路徑,文件名是被調試文件的名稱,它須是執行文件(EXE),兩個參數是運行被調試文件時所需要的命令參數,在DEBUG程序調入后,出現提示符“-”,此時,可鍵入所需的DEBUG命令。
在啟動DEBUG時,如果輸入了文件名,則DEBUG程序把指定文件裝入內存。用戶可以通過DEBUG的命令對指定文件進行修改、顯示和執行。如果沒有文件名,則是以當前內存的內容工作,或者用命名命令和裝入命令把需要的文件裝入內存,然后再用DEBUG的命令進行修改、顯示和執行。
2、DEBUG的主要命令
(1)、檢查和修改寄存器內容的命令R,它有三種方式:
1)顯示CPU內部所有寄存器內容和標志位狀態,格式為:-R
例如:輸入-R↙,得到結果如下:
2)顯示和修改某個指定寄存器內容,格式為:-R 寄存器名
例如:輸入-R AX,得到結果如下:
表示AX當前內容為0000,此時若不對其作修改,可按ENTER鍵,否則,輸入修改內容后,如:
則AX內容由0000改為0A0A
3)R命令顯示標志寄存器標志位狀態的含義如下表所示:
標 志 名 |
置 位(值為1) |
復 位(值為0) |
溢出Overflow(是/否) |
OV |
NV |
方向Direction(減量/增量) |
DN |
UP |
中斷Interrupt(允許/屏蔽) |
EI |
DI |
符號Sign(負/正) |
NG |
PL |
零Zero(是/否) |
ZR |
NZ |
輔助進位Auxiliary Carry(是/否) |
AC |
NA |
奇偶Parity(偶/奇) |
PE |
PO |
進位Carry(是/否) |
CY |
NC |
修改標志位狀態,命令格式為:-RF
例如:輸入-RF,輸出結果如下:
這時若不作修改可按ENTER鍵,否則在“-”號之后鍵入修改值,鍵入順序任意。如:
(2)、匯編命令A,格式為:-A[地址]
該命令從指定地址開始允許輸入匯編語句,把它們匯編成機器代碼相繼存放在從指定地址開始的存儲器中。A命令中如果沒有指定地址,則接着上一個A命令的最后一個單元開始;若還沒有使用過A命令,則從當前CS : IP開始。
例如:輸入代碼,則代碼存儲在OAFO:0100至OAFO:010D單元中。
(3)、反匯編命令U,有兩種格式:
1)-U[地址]
該命令從指定地址開始,反匯編32個字節,若地址省略,則從上一個U命令的最后一條指令的下一個單元開始顯示32個字節。
2)-U范圍
該命令對指定范圍的內存單元進行反匯編,例如:
-U 0100 011E或-U 100 11E 或-U 0AF0:0100 011E或–U 0AF0:0100 L1F(L用來引導指令的條數,1F為指令的條數),這些命令是等效的。
(4)、運行命令G,格式為:
-G [=地址1][地址2]
其中地址1規定了運行起始地址,后面的地址為斷點地址。若省略地址,則運行從IP所指的地址開始。例如:
(5)、追蹤命令T,有兩種格式:
1)逐條指令追蹤:
-T
該命令從指定地址起執行一條指令后停下來,顯示寄存器內容和狀態值。例如:
2)多條指令追蹤:(有問題)
-T[=地址][值]
該命令從指定地址起執行n條命令后停下來,n由[值]確定。
(6)、顯示內存單元內容的命令D,格式為:
-D[地址](從給出的地址開始連續顯示128個字節的單元內容)或-D[范圍],例如:
(7)、修改內存單元內容的命令E,它有兩種格式:
1)用給定的內容代替指定范圍的單元內容:
-E地址 內容表
例如:-E 2000:0100 F3 “XYZ” 8D
其中F3,“X”“Y”“Z”和8D各占一個字節,用這五個字節代替原內存單元2000:0100到0104的內容,“X”“Y”“Z”將分別按它們的ASCII碼值代入。
2)逐個單元相繼地修改:
-E地址
例如:-E 100:
0AF0:0100 F3.E7
此命令是將原100號單元的內容F3改為E7。E7是鍵入值。
(8)、命名命令N,格式為:
-N 文件名
此命令將文件名格式化在CS:5CH的文件控制塊內,以便使用L或W命令把文件裝入內存進行調試或者存盤。例如:
(9)、裝入命令L,它有兩種功能:
1)把磁盤上指定扇區的內容裝入到內存指定地址起始的單元中,格式為:
-L 地址 驅動器 扇區號 扇區個數
2)裝入指定文件,格式為:
-L [地址]
此命令裝入已在CS:5CH中格式化的文件控制塊所指定的文件。
在用L命令前,BX和CX中應包含所讀文件的字節數。
3)裝入已在文件控制塊中的文件,格式為:
-L
此命令與-L [地址]相同功能。
(10)、寫命令W,有兩種格式:
1)把數據寫入磁盤的指定扇區:
-W 地址 驅動器 扇區號 扇區數
2)把數據寫入指定文件中:
-W [地址]
此命令把指定內存區域中的數據寫入由CS:5CH處的FCB所規定的文件中。在用W命令前,BX和CX中應包含要寫入文件的字節數。
(11)、十六進制運算命令H,格式為:
-H [數據1] [數據2]
其功能是將兩個十六進制數進行相加、相減運算,結果顯示在屏幕上。例如:
(12)、退出DEBUG命令Q,該命令格式為:
-Q
它退出DEBUG程序,返回DOS,但該命令本身並不把在內存中的文件存盤,如需存盤,應在執行Q命令前先執行寫命令W。
附二.DEBUG32的重要擴展命令的使用
(1)、R16/R32更換寄存器顯示位數命令
R16 設置 16 bit 顯示模式
R32設置 32 bit 顯示模式
(2)CLS清屏命令
D 查看數據內容指令:
D 命令——查看內存單元
前面我們學到,內存每 16 個字節單元為一小段,邏輯段必須從小段的首址開始。用 D 命令可以查看存儲單元的地址和內容。
D 命令格式為:
D 段地址:起始偏移地址 [結尾偏移地址] [L范圍]
例如:
D DS:0 查看數據段,從 0 號單元開始 D ES:0 查看附加段,從 0 號單元開始 D DS:100 查看數據段,從 100H 號單元開始 D 0200:5 15 查看 0200H 段的 5 號單元到 15H 號單元(在虛擬機上該命令不能執行) D 0200:5 L 11 用 L 選擇范圍。查看 0200H 段的 5 號單元到 15H 號單元共 17 個單元
圖中第一條 D 命令顯示的是數據段存儲單元的內容,可以看到數據段的段地址為 DS,其值 0B05H。0 號單元的內容為 CDH,1 號單元為 20H ,...,第 15 號單元的內容為 03H;第二行 0010H 號(16 號)單元的內容為 69H,它是小寫字母 i 的 ASCII 碼,因此右邊區域中顯示了 i ,表示該單元的值 69H 可以看成 ASCII 碼。
第二條 D 命令顯示 0200H 段中的內容,也是從 0 號單元開始。
第三條 D 命令從 0200H 段的 5 號單元開始顯示直到 15H 號單元。
如果在 D 后面直接寫出偏移地址,則顯示當前數據段下偏移地址開始的內存單元,如:
D 10 從數據段10H號單元開始顯示 D100 從數據段100H號單元開始顯示
注意:多次鍵入 D,可連續顯示后面的單元內容
用 D DS:0
命令顯示后,可以看到,這三個單元的值由原來的 9F 00 9A 修改為 14 15 16。
如果 E 后面直接跟偏移地址,則修改當前數據段下偏移地址所指單元值;還可以用 E 命令修改其它段的存儲單元內容。
E 10 修改當前數據段10H號單元內容 E ES:100 修改附加段100H號單元內容 D ES:100 查看一下100H單元的內容是否修改了
U 后跟偏移地址,則從該地址開始反匯編。如:
U 0 從代碼段0號單元開始反匯編 U100 從代碼段100H號單元開始反匯編
需要注意的是,圖 2-22 中顯示的程序代碼並不是用戶編寫的程序,因為在輸入 DEBUG 命令時沒有寫用戶程序名.EXE。這段程序代碼是系統代碼段中保存的內容,有可能是系統程序,也有可能是無效的代碼。
(5)A 命令——輸入匯編指令
在 DEBUG 中,使用 A 命令可以輸入匯編指令,系統自動地將鍵入的匯編指令翻譯成機器代碼,並相繼地存放在從指定地址開始的存儲區中。由於 DEBUG 下的數值默認為十六進制數,因此先要將十進制數轉換成十六進制數。
例如,第 1 章提到的計算 Z = 35 + 27 的匯編指令為:
MOV AX,23H ADD AX,1BH MOV [0000],AX
加法的結果 Z=62=3EH。變量 Z 用存儲單元[0000]表示。這三條指令可在 DEBUG 下用 A 命令直接輸入。輸入 A 命令后,系統自動地給出邏輯地址為 0AEE:0100(CS:偏移地址),在其后輸入匯編指令,回車后可輸入下一條指令,直接回車則退出輸入