DEBUG命令詳解
DEBUG是專門爲彙編語言設計的一種調試工具,它通過步進,設置斷點等方式爲彙編語言程序員提供了非常有效的調試手段。
筆者使用DOSBOX進行一些DEBUG指令的演示
DEBUG程序的啓動
1.沒有文件名,直接打開DEBUG
C:>DEBUG
段寄存器CS、DS、ES和SS置爲DEBUG程序後的第一個段。指令指針寄存器IP置爲100H(程序段前綴PSP後的第一個語句)。 堆棧指針SP置爲段末或COMMAND.COM暫駐部分的結束地址(其中較小的那個地址)。
2.對指定可執行文件進行 DEBUG
C:>DEBUG NAME.EXE
DEBUG主要命令
1.彙編命令 A
使用格式 -A[地址]:由使用者輸入彙編語句,DEBUG負責將它們彙編成機器代碼相繼存放在從指定地址開始的存儲器中。
(這裏DEBUG將我的四個彙編語句存在了內存中地址從 163B:1000 開始的幾個字節中,前兩句彙編語句都佔了3個字節,加法語句佔2個字節,最後一句彙編語句佔了3個字節)
2.反彙編命令 U
(1)格式:-U [地址]該命令從指定地址開始,反彙編 (指把機器代碼翻譯成彙編語句)32個字節,若地址省略,則從上一個U命令的最後一條指令的下一個單元開始顯示32個字節。
(反彙編了內存中163B:1000開始的32個字節的機器代碼,得到的前四條語句即先前筆者使用-A命令彙編的四條彙編指令)
(取這段地址是因爲DEBUG OUTPUT.EXE時發現代碼段CS的地址就是從076D:0000,和本文末尾的output.asm中的源代碼比較一下,已經成功的把我的源代碼在彙編過程得到的機器代碼反彙編成了彙編指令)
(2)第二種格式:-U [地址範圍] 對該地址範圍中的機器代碼進行反彙編
3.運行命令 G
格式 -G 地址 顯示執行到該地址時寄存器中的內容(相當於斷點調試)
(這裏我們還是調試OUTPUT.EXE,首先使用-R命令檢查初始時的寄存器內容,我們現在只關注AX,DS寄存器,開始AX=FFFF,DS=075C,然後使用-G命令運行到076D:0003斷點,此時AX=076C,DS=075C,這是因爲程序至此已經將076C傳送給AX寄存器,但還沒有進行‘MOV DS,AX’ ,我們再使用-G命令運行到0005斷點,此時DS=AX=076C,所以說這裏-G起到了斷點調試的效果)
4.追蹤命令 T
(1)逐條指令追蹤:-T[=地址] 從該地址開始執行一條指令停下來檢查寄存器狀態
(從076D:0000 開始執行一條指令後,我們的寄存器狀態如上圖所示)
(2)多條指令追蹤:-T[=地址][值] 該命令從指定地址起執行n條命令後停下來,n由[值]確定。
(從076D:0000 開始執行5條指令後,我們的寄存器狀態如上圖所示,筆者注意到,這裏完成第五條指令‘MOV AX ,02’後,AX並不是變成0002,而是從076C變成了026C,這是需要注意的)
5.顯示內存單元內容 D
格式爲 -D[地址]或-D[範圍]
(OUTPUT.EXE的數據段寄存器DS=076C,所以我們檢查這一部分內存單元的內容,這裏‘123ABC’,是我們程序中在數據段定義的數據)
6.修改內存單元內容 E
(1)批量修改,-E 地址 內容表 將指定地址開始的內存單元中的內容替換成內容表中的內容:
(這裏我們修改了數據段中的從076C:0010開始的幾個字節的內容,其中1C ,8D ,‘H’,‘E’,‘L’,‘L’,‘O’各佔一個字節,也就是說我們替換了076C:0010至0016總共7個字節的內容)
(2)單個修改,-E 地址
(這裏我們修改了數據段中的從076C:0016這一個字節中的內容,把它從‘O’修改成了‘P’)
7.檢查和修改寄存器內容 R
(1)顯示CPU內部所有寄存器內容和標誌位狀態:
(參照下面的表,當前CPU標誌寄存器中的含義爲 OF=‘無溢出 ’DF=‘增量方向’IF=‘允許中斷’ SF=‘正號’ZF=‘非零’ AF= ‘無輔助進位 ’PF=‘奇’CF= ‘無進位’)
標誌位含義表
標誌名 | 置位 | 復位 |
---|---|---|
溢出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 |
(2)顯示和修改指定寄存器的內容:
-R 寄存器名
例如打入:-R AX
系統將可能響應如下:(當AX中值爲FIF4時)
AX FIF4
表示AX當前內容爲F1F4,此時若不對其作修改,可按ENTER鍵,否則,打入修改後內容,
如: -R BX
BX 0369 :059F
則BX內容由0369改爲059F
(顯示AX內容,按回車結束,不做修改)
(顯示BX內容,並將其修改爲002B)
(3)顯示和修改標誌位狀態:(標誌位含義參見上文中的‘標誌位含義表’)
-RF
系統將給出響應,如
OV DN EI NG ZR AC PE CY-
這時若不作修改可按ENTER鍵,否則在“-”號之後鍵入修改值,鍵入順序任意。如
OV DN EI NG ZR AC PE CY-PO NZ DI NV
(修改了OF,將OF置位)
8.命名命令 N
-N 文件名
此命令將文件名格式化在CS:5CH的文件控制塊內,以便使用L或W命令把文件裝入內存進行調試或者存盤。
9.裝入命令 L
存盤。
(1)把磁盤上指定扇區的內容裝入到內存指定地址起始的單元中,格式爲:
-L 地址 驅動器 扇區號 扇區數
(2)裝入指定文件,格式爲:
-L [地址]
此命令裝入已在CS:5CH中格式化的文件控制塊所指定的文件。在用L命令前,BX和CX中應包含所讀文件的字節數。
10.寫命令 W
(1)把數據寫入磁盤的指定扇區:
-W 地址 驅動器 扇區號 扇區數
(2)把數據寫入指定文件中:
-W [地址]此命令把指定內存區域中的數據寫入由CS:5CH處的FCB所規定的文件中。在用W命令前,BX和CX中應包含要寫入文件的字節數。
11.退出命令 Q
退出DEBUG,該指令退出DEBUG程序,返回DOS,但該命令本身並不把在內存中的文件存盤,如需存盤,應在執行Q命令前先執行寫命令W。