複製鏈接
請複製以下鏈接發送給好友

debug命令

鎖定
DEBUG是一個DOS實用程序,是供程序員使用的程序調試工具,可以用它檢查內存中任何地方的字節以及修改任何地方的字節。它可以用於逐指令執行某個程序以驗證程序運行的正確性,也可以追蹤執行過程、比較一個指令執行前後的值以及比較與移動內存中數據的範圍,讀寫文件與磁盤扇區
中文名
程序調試工具命令
外文名
debug
性    質
DOS實用程序
作    用
程序員使用的程序調試工具
優    點
檢查內存字節

debug命令命令介紹

它的功能包括以下幾個方面。
⒈ 直接輸入,更改,跟蹤,運行彙編語言源程序;
⒉ 觀察操作系統的內容;
3.查看ROM BIOS的內容;
⒋觀察更改RAM內部的設置值;
⒌以扇區或文件的方式讀寫軟盤數據
DEBUG把所有數據都作為字節序列處理。因此它可以讀任何類型的文件。DEBUG可以識別兩種數據: 十六進制數據和ASCⅡ碼字符。它的顯示格式是各個字節的十六進制值以及值在32與126之間的字節的相應ASCⅡ碼字符。
在DEBUG中輸入數據有兩種方法: 提示方法和非提示方法。在用提示方法時,用户可以輸入要求輸入數據的命令,後跟數據所要輸入的地址。然後用户就可以看到該地址中已有內容及一個冒號提示符。此時用户可以在提示符下輸入一個新的值或者按下回車鍵或CTRL+C回到短橫(-)提示符。在運用非提示方法時,用户可以輸入要輸入數據的內存地址以及要輸入的字節。但與使用字處理程序或正文編輯程序時不一樣,在使用DEBUG時,用户不能直接移動光標到一入口點輸入或修改數據,而要一次輸入一個或幾個字節。
在使用DEBUG時可以只涉及內存中的數據,從而一般都要指定所要處理的內存地址,地址的輸入格式是: [段地址]: [位移]。如果沒有輸入地址,DEBUG將假定為當前內存段,從位於地址100H的字節開始。前100H字節保留給程序段前綴使用,這一專用區域用於建立DOS與程序之間的聯繫。DEBUG總是用四位十六進制數表示地址。用兩位數表示十六進制數據。
講到這裏大家應該對DEBUG有了初步的瞭解,但是光知道這些可不夠,接下來我來講講DEBUG的命令格式和命令。當輸入DEBUG,就調用了DEBUG程序,就會出現一個短橫提示符,用户就可以在這一短橫後輸入DEBUG程序的命令。有些DEBUG命令會顯示一個內存地址併產生一個作為提示符的冒號。在這些提示符後,用户可以輸入一個新值以改變所顯示位置原來的值。如果用户不輸入一個新值而是按下回車或CTRL+C,那麼原來的值不會改變。
一般用不着把地址和命令名字分開。例如,用轉儲命令D察看100號地址的數據,那麼這個命令可以用以下任一種形式輸入:
D100
D,100
D 100
如果輸入的命令中出現了錯誤,DEBUG將在下一行對着錯誤的位置標記出來,例如:
-s100 d 12
^Error

debug命令命令功能

debug命令A 彙編命令

功能: 將指令直接彙編成機器碼輸入到內存中。
説明: 用於小段程序的彙編及修改目標程序,所有輸入的數字均採用十六進制, 用户裝入內存的彙編語句是連續存放的,若沒有指定地址,並且前面沒有使用匯編命令,該語句被彙編到 CS:0100區域。
例A:>DEBUG
-a 0100
08F1:0100 MOV AH,09
08F1:0102 MOV DX,109
08F1:0105 INT 21H;
08F1:0107 INT 21H;<-XP下運行cmd debug時,應該是INT 20H,21H會出遇無效指令錯誤
08F1:0109 db 'May I help you $'
08F1:0115←離開a狀態
-g ←運行
May I help you 運行結果
Program terminated normally表示運行正常

debug命令C比較命令

功能: 比較兩內存區域中的內容是否相同,若不同則顯示其地址和內容。
如:C4000:0 3F 100
就是用來比較4000:0000-4000:003F與DS:0100-DS:013F之間的內容:其顯示格式如下:
內存地址1內含值1內含值2內存地址2
例:比較4000:0 3F 100內容的差異
-C4000:0 3F 100
4000:0000 64 43 08F1:0100
4000:0001 3E 69 08F1:0101 顯示內容的差異處
4000:0002 78 FF 08F1:0102
……………………………………
如果要比較的範圍在DS內,則段地址不必指出:
如:-C 0 4 100;比較DS:0---DS:4與DS:100---DS:104
C命令的另一種格式如下:C地址1 L 長度 地址2
如:-C000:0 L4 0;由0000:0與與DS:0開始比較它同-C0000:0 3 0命令相等,顯示結果如下:
0000:0000 8A C0 08F1:0000
0000:0001 10 20 08F1:0001 它們都比較4個字節
0000:0002 1C 00 08F1:0002
0000:0003 49 7F 08F1:0003

debug命令D轉儲命令

* D[地址] 或D[起始地址][目的地址] 轉儲命令
功能: 以內存映象方式顯示內存中的信息。
説明: 轉儲用左右兩部分顯示內存映象內容,左邊以十六進制,右邊以ASCⅡ字符顯示,所有不可打印字符用句號(。)表示。每行顯示16個字節的內容,在第八和第九個字節之間有一個連字符 - 此命令隱含的段地址為DS的值。若未指定起始地址,則D命令從顯示的最後一個單元的下一個單元開始顯示,若以前沒有使用給D命令, 則從初使化的段寄存器的內容,加上地址偏移量 0100H 開始顯示。
例:-d10,4f即為顯示DS:4f的內容在D命令中如不指出段地址,則其默認為DS段。
如指明段地址,則從指明的段地址列出指定的範圍
如:-dfff:00:0f
我們也可以指定長度來列出所需要內存內容
如:-d 100 L20即為顯示由DS:100-DS:11F的內容,共20H個字節:

debug命令E修改內存命令

* E[地址] [字節串)
功能: 從指定的地址開始修改內存值。
格式:E起始地址[數據行]
⑴用給定內容代替指定範圍的單元內容
-E地址 內容表
例:-E100 41 42 43 44 48 47 46 45
-D 100,L08
08F1:0100 41 42 43 44 48 47 46 45 ABCDHGFE…
⑵逐個內存內容
例:-E 100:
08F1:0100 76 42 :42是操作員鍵入
此命令是將原100號內存內容76修改為42,用D命令可察看。

debug命令F填寫命令

* F[地址範圍] [字節或字節串] 填寫命令
功能: 將要填寫的字節或字節串填入由地址範圍指定的存儲器中。
例:-f100 120 61 62 63 64
-d100 11f
08F1:0100 61 62 63 64 61 62 63 64 -61 62 63 64 61 62 63 abcd abcd abcd abcd
08F1:0110 13 67 98 E3 C8 2E B3 B6 -03 21 AC 19 3121 4E 96 g……1…
如果數據行超出指定的範圍,則填不下的數值會被忽略。
例:-f 100 107 41 43 43 44 45 46 47 48 49 4A 4B 4C 4D -d 100,lof
08F1:0100 41 42 43 44 45 46 47 64 -61 62 63 64 ABCDEFGdabcdabcd
由上例可看出,超出範圍的數據被忽略
另外,F和E命令都可填入字符串:
如:-F 100 105 "MSDOS"
-d 100 l0f
08F1:0100 4D 53 44 4F 53 46 47 64 -61 62 63 64 MS DOS FGabcd abcd

debug命令G執行命令

功能: 執行正在調試的程序,當達到斷點時停止執行, 並且顯示寄存器標誌和下一條要執行的命令。
説明: 如果沒有指定起始地址,那麼當前指令地址由CS,IP寄存器的內容來決定,如果用户指定起始地址就從指定的起始地址開始執行。如果指定斷點,當指令到達指令地址時停止執行,並顯示各寄存器標誌位的內容和下一條要執行的命令,最多允許用户設定10個斷點。
例:A:\>debug tan.exe
-u:反編譯成彙編語言程碼
…………
. .
-g 100 指定中斷點
Program terminated normally:
另外:我們在DEBUG下可運行一個文件.EXE
如:A:\>debug tan.exe
-g
即可開始運行此程序,和在DOS下完全一樣:

debug命令H十六進制算術運算命令

* H[數值][數值] 十六進制算術運算命令
功能: 分別顯示兩個十六進制數相加的和以及第一個數減去第二個數的差。
説明: 替用户完成簡單的十六進制數的運算。
例:-h4538 5623
9B5B EF15
I命令
功能: 從指定的端口輸入並顯示(用十六進制)的一個字節。
例:-i70
F9;顯示70端口的內容為F9
I命令可由80X86的64K個端口取數據

debug命令L命令

功能: 將一個文件或盤的絕對扇區裝入存儲器。
説明: 單個L命令能夠裝入的最大扇區數是 80H,其中盤號 0,1,2,3……分別代表 A,B,C,……出現讀盤錯,顯示錯誤信息。
⑴格式1.L裝入地址 驅動器名 起始扇區/扇區數
這種方式可把磁盤上指定扇區範圍的內容裝入到存儲器從指定地址開始的區域中,在此外扇區編號引用邏輯/扇區的方式。
例:-L 100 0 01,將A驅的0扇區裝至CS:100上
-d 100 10f
08F1:0100 EB 3C 90 3C 53 44 4F 53 -36 2E 32 32 02 01 01 00.L,MSDOS 6.22……
⑵格式2:L裝入地址
這種方式可把指定文件裝入內存,裝入的文件可在進入DEBUG時指定亦可用N命令建立,格式為-n文件名:
例1 DEBUG tan.pas
-L 100
例2 DEBUG
-n tan.pas
-L 100
須知:L命令只能讀取邏輯扇區,不能讀取硬盤分區表
L命令中所用的磁盤代碼A=00,B=01,C=02……

debug命令M數據命令

功能: 把地址範圍內的存儲器單元的內容移到起始地址的指定地址中
説明: 傳送期間,源區和目標區可以部分重疊;傳送後源區域數據保持不變。
例:-e100 41 42 43 44 45
-d100 10f
08F1:0100 41 42 43 44 45 62 62 63 64 -61 62 63 64 61 62 63 64 ABCDEBCDABCDABCD
-M 100 104 110
-d110 L1F
08F1:0100 41 42 43 45 0A 21 19-20 01 01 20 07 96 87 9F ABCDE……

debug命令N命令

* N[盤號: ] [路徑] [文件名] [擴展名]
功能: 定義操作文件名。
説明: 可同時定義兩個操作文件,並將形成的文件控制塊相應的設置在內存 CS:5C和CS:6C上,供以後的L和W命令操作之用。我們在運行程序偵錯時,在啓動DEBUG時在其後加文件程序名以及該程序的參數或運行文件,但當我們偵錯一段後,可能裝入其它文件來測試,這時我們可利用N命令來設置而無需退出DEBUG。
例:A:\>DEBUG tan.exe
-n youg.pas
當程序偵錯一段時間後,若要把tan.exe裝入tan1.pas則-ntanl.pas

debug命令O輸出命令

功能: 發送字節到指定的輸出端口。
例:當我們遇到開機要求輸入口令時,可用如下方式取消
-O 70 10
_O 71 00

debug命令P進程命令

功能: 將一個子程序調用指令,循環指令,中斷指令或一個重複字符串指令,停止在下一條指令上。
説明: 在執行一條子程序調用指令,循環指令,中斷指令或一個重複字符串指令時,發出P命令去執行有關指令,並且返回到要執行的下一條指令。P命令和T一樣選用來跟蹤程序運行過程用的命令,我們可以在P命令中指定程序運行的起始地址,指令個數,如未指定則CS:IP所指定程序的地址開始一次運行一條令。
P與T命令的差別在於P命令把CALL/INT當成一條指令來執行,簡化了跟蹤過程,P命令只運行RAM內存的命令,而T命令則可運行RAM和ROM裏的程序。

debug命令R寄存器命令

功能: 一,顯示單個寄存器的內容,並提供修改功能。二,顯示所有寄存器內容, 再加上字母標誌位狀態以及要執行的下一條指令。三,顯示8個標誌位狀態, 並提供修改功能。若不想改變則回車即可。
例:-r bx
bx 0050
:51
-r
AX=0000 BX=0051 CX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0003 ES=0CD3 SS=0CD3 IP=0100 NV UP EI PL NZ NA PO NC
0CD3:0100 0F DB OF
若想改變標誌寄存器,用-RF回車,則DEBUG會將標誌內容顯示出來,若想改變任一標誌,只要輸入該標誌的名稱即可。
標誌名稱 設置 未設置 標誌名稱 設置 未設置
滋出 OV(溢出) NV(未溢出) 零位 ZR NZ(不等於零)
方向 DN(減少) UP(增加) 輔助進位 AC NA(無進位)
中斷 EI(許可) DI(禁止) 奇偶標誌 PE(偶) PO(奇)
符號 NG(負) PL(正) 進位 CY NC(清除進位)
例:-Rf
NV UP EI PL NZ NA PO NC :-OV DI← 輸入值

debug命令S命令

功能: 在指定的地址範圍內查找給定的字符串。
説明: 用來指定在地址範圍內查找一個字符串,若找到則顯示其地址, 否則直接顯示DEBUG提示符。隱含地址為DS段值。
在此內存可以用(起始地址)(終止地址)或(起始地址)L(長度)的方式來表示,而字符串與數據行則可混合使用:如:02.76"BC"。
例:-d100 lof
08F1:0100 OF 2A 41 43 0B 31 42 96 -FF F0 B9 8A F3 00 B1.. AC,1B...
-S 100 lof"AC"
08F1:0102← 表示找到,由0102開始,

debug命令T跟蹤命令

功能: 逐條跟蹤程序的執行,每條指令執行後都將顯示各寄存器的內容。
説明: 通常採用跟蹤一條指令,但用户也可以用指令條數設定一次跟蹤多條指令, 每執行一條指令之後,顯示所有寄存器的內容和標誌狀態。
逐條指令跟蹤 -T[=起始地址]
從指定地址起執行一條指令後停下來,顯示所有寄存器內容及標誌位的值,如來指定地址則從當前CS:IP開始執行。
A:\>DEBUG
-A
08F1:0100 MOV DL,03H
08F1:0102 MOV AH,02H
08F1:0104 INT 21H
08F1:0106 INT 20H
08F1:0108
-T
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=08F1 ES=08F1 SS=08F1 CS=08F1 1P=0105 NV UP EI PL NZ PO CY
09F1:0102 B402 MOV AH,02
若指定起始地址,則T命令會從指定的地址開始跟蹤,我們還可以指定跟蹤一次所運行指令的個數,用Ctrl+S暫停屏幕的顯示,以便觀察。
-t=100 10;由CS:100開始跟蹤10條指令

debug命令U地址命令

功能: 將內存中的內容轉換為彙編語句。
説明: 反彙編的字節數取決與用户的系統顯示形式,以及在U命令中使用的可選項。
⑴從指定地址開始編譯,反彙編32個字節
-U[地址]←從CS:100開始,其反彙編32個字節
如果地址被省略,則從一個U命令的最後一條指令的下一條單元開始彙編32個字節。
⑵對指定的存貯範圍進行反彙編
-u起始地址 終止地址(L 長度)
例:-U 100 109
08F1:0100 CD20 INT 20
08F1:0102 FF9F009A CALL FA12[BX+9A00]
08F1:0106 F0 LOCK
08F1:0107 FE1D CALL FAR [DI]
08F1:0109 F0 LOCK
説明:如指定了範圍則整個範圍全都會被反編譯

debug命令W寫盤命令

* W[地址] [盤符:] [起始扇區] [扇區數] 寫盤命令
功能: 將修改過的數據寫到磁盤上。
説明: 可以將指定內存地址開始的數據寫在磁盤上,可以在沒有指定參數, 或指定地址參數的情況下,將調試文件寫在磁盤上。
在運行W時需設置文件的大小CX或BX寄存器
⑴把數據寫入磁盤的指定扇區
-W 起始地址 驅動器名 起始扇區 扇區數
⑵把數據寫入指定文件中
-W 起始地址
例A:\>DEBUG
-A
08f1:0100....
. 寫入程序段
08F1: 012A....
-R CX
CX:0000
:2A←寫入字節數,即為程序結尾地址減起始地址
-n tan.com←設置文件名,需後綴為com
-w
Wring 002A bytes
-q
A:\>TAN←即可執行此程序

debug命令"XD"命令

* "XD"命令:釋放EMS內存
例:-XD 0001
handle 0001 deallocatel←釋放了
利用XD釋放後可再分配

debug命令"XM"命令

*"XM"命令;把擴充內存上的內存頁區映射到主內存區
格式:XM RAM 長頁碼 主內存頁碼句柄
例:-XM3 2 0001←把0001號句柄的第3號邏輯頁區映射到2號真實頁區
Logical page 03 mapped to physical page 02

debug命令"XS"命令

*"XS"命令:顯示當前EMS使用情況。
格式 -XS

debug命令實際應用

⒈ 非物理0磁道壞軟盤的修復
此種損壞從軟盤盤面上來看並沒有明顯的劃傷和黴變。一般可以恢復其數據,也可使軟盤重新在利用。
處理方法如下:
Ⅰ. 進入debug
Ⅱ. 取一張引導區沒有損壞的好磁盤,插入軟驅
-l 100 0 0 1
Ⅲ. 插入損壞的磁盤到軟驅
-w 100 0 0 1
-q
注意:好盤與壞盤容量必須相同
⒉ 物理0磁道壞軟盤中的數據讀取
對於0磁道損壞的磁盤,一般來説是應該拋棄了,當你也不妨試一試已下方法:
磁化處理:用較強的磁鐵在靠近壞磁盤的表面處反覆移動,切不可碰到磁盤介質,以免劃傷表面,然後在試試格式化。
軟盤換面:小心的將磁盤打開,堅磁片與金屬芯片分開,翻面後再按原來的方法粘在一起即可,在重新格式化。
diskfix:對於diskfix想必大家都用的比較多了,裏面的磁盤修復功能很好用的。能修復大多數磁盤表面錯誤。
⒊ 硬盤啓動失敗處理
在正常機上格式化一張軟盤,無其它數據
進入debug
-l 0 2 0 1
-w 0 0 0 1
-q
用系統盤啓動故障機後
在進入debug
-l 0 0 0 1
-w 0 2 0 1
-q
⒋ 軟盤不能正確讀取解決方法
如果使用軟盤時出現如下提示
general failure error reading drive a
可以用以下方法解決:
將一張好盤插入軟驅
進入debug
-a 100
****:*100 mov al,0
****:**** mov cx,1
****:**** mov dx,0
****:**** mov bx,1000
****:**** int 25
****:**** int 20
回車
-g=0100
插入壞盤並進入debug
-a 200
****:*100 mov al,1
****:**** mov cx,1
****:**** mov dx,0
****:**** mov bx,1000
****:**** int 26
****:**** int 20
回車
-g=200
⒌ cmos 數據的保存,恢復
cmosram的’地址口’的口地址為 70h ’數據口’的口地址為 71h 讀取時只需將讀的cmosram的地址送到70h,隨後就可以從71 h中得到所需數據。
⑴讀取cmos數據 進入debug
-a 100
****:*100 mov bx,1000
****:**** mov cx,0040
****:**** mov ax,0000
****:0109 mov dx,cx
****:**** mov cx,0005
****:010e loop 010e
****:**** out 70,al
****:**** mov cx,0005
****:0115 loop 0115
****:**** in al,71
****:**** mov 【bx】,al
****:**** cmp ah,0e
****:**** jb 0123
****:**** add ah,80
****:0123 inc ah
****:**** inc bx
****:**** mov cx,dx
****:**** mov al,ah
****:**** loop 0109
****:**** mov ah,3c
****:**** mov dx,0150
****:**** mov cx,0020
****:**** int 21
****:**** mov bx,ax
****:**** mov dx,1000
****:**** mov cx,0040
****:**** mov ah,40
****:**** int 21
****:**** mov ah,4c
****:**** int 21
-a 150
****:0150 db "cmos.dat",0
****:0159
-r cx
cx 0000
:60
-n save cmos.com
-w
-q
-w 100 2 0 1
-q
⑵恢復cmos數據 進入debug
-a 100
****:*100 mov cx,0150
****:**** mov ah,3d
****:**** mov al,00
****:**** int 21
****:**** mov dx,1000
****:**** mov bx,ax
****:**** mov cx,0040
****:**** mov ah,3f
****:**** int 21
****:**** mov ax,0000
****:**** mov bx,dx
****:**** mov dx,cx
****:**** mov cx,0005
****:**** loop 011f
****:**** mov al,ah
****:**** out 70,al
****:**** mov cx,0005
****:**** loop 0128
****:**** mov al,【bx】
****:**** out 71,al
****:**** jb 0136
****:**** add ah,80
****:**** inc ah
****:**** inc bx
****:**** mov cx,dx
****:**** loop 011a
****:**** mov ax,0040
****:**** mov ds,ax
****:**** mov ax,1234
****:**** mov 【0072】,ax
****:**** jmp ffff:0000
-a 150
****:0150 db "cmos.dat",0
****:0159
-r cx
cx 0000
:60
-n write cmos.com
-w
-q
⒍ dos 引導扇區數據的保存與恢復
dos引導程序是被讀到內存0000:7c00初開始執行的
獲得正常的引導程序
進入debug
-l 100 2 0 1
-n a:dosboot.com
-r cx
:200
-w
-q
裝入引導程序
進入debug
-n a:dosboot.com
-l
-r cx
:200
-w 100 2 0 1
-q
⒎ 硬盤主引導扇區數據的保存與恢復
硬盤工作正常時讀取主引導扇區信息
注意:當分區改變時不能用此數據恢復
保存主引導扇區數據進入debug
-a 100
mov ax,0201
mov bx,0110
mov cx,0001
mov dx,0080
int 13
int 3
-g=100
-e 102 3
-e 10e c3
-r bx
bx 0110
:0
-r cx
cx 0001
:210
-n a:rboot.com
-w
-q
恢復主引導扇區數據:只需運行a盤的rboot.com
⒏ 硬盤非分配表備份與恢復
計算機運行正常時分配表備份
進入debug
-l 100 2 0 1
-n a:dbrup.dat
-r cx
:200
-w
恢復
進入debug
-n a:dbrup.dat
-l
-w 100 2 0 1
-q
⒐ 硬盤保護卡內幕
對於經常在外邊上機的人來説,計算機維護人員一旦設置硬盤保護卡,自己作一些事來特別麻煩,想不想屏蔽掉硬盤保護卡,用以下方法或許可以借鑑:
進入debug
-a 100
mov ah,0
mov dl,0
int 13
-t
一直按t知道找到 cs=f000 記下此時 ds 的值 如:1234
-e e0:4c
34 12 00 f0
-q
⒑ 用debug作硬盤低級格式化
硬盤低級格式化一般用dm,但debug也可以低級格式化硬盤
進入debug
-a 100
mov ax,500
mov bx,180
mov cx,0
mov dx,80
int 13
int 3
-e 180 0 0 0 2
-q
⒒ 冷啓動與熱啓動
用debug實現系統冷啓動與熱啓動程序
冷啓動:
-a 100
jmp ffff:0
int 20
-n a:reset.com
-r cx
:0007
-w
-q
熱啓動:
-a 100
mov ax,0040
mov ds,ax
mov ax,1234
mov si,0072
mov (si),ax
jmp ffff:0
-n a:rset.com
-r cx
:0014
-w
-q
⒓ dos內部命令加密
如加密 dir
用pctools或diskedit找 c:下的command.com文件
編輯該文件
pctools中:f-----f1 然後找所有03 44 49 52 找到後按f5修改成你所要的值 如:foo 以後只有輸入foo 才能列出文件或文件目錄。
diskfix 有良好的界面,操作起來和pctools差不多。
注意:如果不能修改,則解開文件的鎖定 luck
其它命令代碼
type 04 54 59 50 45
cd 02 43 44
del 03 44 45 44
copy 04 43 49 50 59