debug命令

debug命令

DOS實用程序
Debug原指一個DOS實用程序,是供程序員使用的程序調試工具,可以用它檢查内存中任何地方的字節以及修改任何地方的字節[1]。它可以用于逐指令執行某個程序以驗證程序運行的正确性,也可以追蹤執行過程、比較一個指令執行前後的值以及比較與移動内存中數據的範圍,讀寫文件與磁盤扇區。DEBUG把所有數據都作為字節序列處理。因此它可以讀任何類型的文件。DEBUG可以識别兩種數據:十六進制數據和ASCⅡ碼字符。它的顯示格式是各個字節的十六進制值以及值在32與126之間的字節的相應ASCⅡ碼字符。
  • 中文名:程序調試工具命令
  • 外文名:debug
  • 所屬學科:
  • 性質:DOS實用程序
  • 作用:供程序員使用的程序調試工具
  • 優點:檢查内存字節

命令介紹

它的功能包括以下幾個方面。

⒈直接輸入,更改,跟蹤,運行彙編語言源程序

⒉觀察操作系統的内容;

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

命令功能

彙編命令

功能:将指令直接彙編成機器碼輸入到内存中。

說明:用于小段程序的彙編及修改目标程序,所有輸入的數字均采用十六進制,用戶裝入内存的彙編語句是連續存放的,若沒有指定地址,并且前面沒有使用彙編命令,該語句被彙編到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 #x27;

08F1:0115←離開a狀态

-g ←運行

May I help you 運行結果

Program terminated normally表示運行正常

比較命令

功能:比較兩内存區域中的内容是否相同,若不同則顯示其地址和内容。

如: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

轉儲命令

* 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個字節:

修改内存命令

* 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命令可察看。

填寫命令

* 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

執行命令

功能:執行正在調試的程序,當達到斷點時停止執行,并且顯示寄存器标志和下一條要執行的命令。

說明:如果沒有指定起始地址,那麼當前指令地址由CS,IP寄存器的内容來決定,如果用戶指定起始地址就從指定的起始地址開始執行。如果指定斷點,當指令到達指令地址時停止執行,并顯示各寄存器标志位的内容和下一條要執行的命令,最多允許用戶設定10個斷點。

例:A:>debug tan.exe

-u:反編譯成彙編語言程碼

…………

. .

-g 100 指定中斷點

Program terminated normally:

另外:我們在DEBUG下可運行一個文件.EXE

如:A:>debug tan.exe

-g

即可開始運行此程序,和在DOS下完全一樣:

算術運算命令

* H[數值][數值] 十六進制算術運算命令

功能:分别顯示兩個十六進制數相加的和以及第一個數減去第二個數的差。

說明:替用戶完成簡單的十六進制數的運算。

例:-h4538 5623

9B5B EF15

I命令

功能:從指定的端口輸入并顯示(用十六進制)的一個字節。

例:-i70

F9;顯示70端口的内容為F9

I命令可由80X86的64K個端口取數據

命令

功能:将一個文件或盤的絕對扇區裝入存儲器。

說明:單個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……

數據命令

功能:把地址範圍内的存儲器單元的内容移到起始地址的指定地址中

說明:傳送期間,源區和目标區可以部分重疊;傳送後源區域數據保持不變。

例:-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……

命令

* N[盤号: ] [路徑] [文件名] [擴展名]

功能:定義操作文件名。

說明:可同時定義兩個操作文件,并将形成的文件控制塊相應的設置在内存CS:5C和CS:6C上,供以後的L和W命令操作之用。我們在運行程序偵錯時,在啟動DEBUG時在其後加文件程序名以及該程序的參數或運行文件,但當我們偵錯一段後,可能裝入其它文件來測試,這時我們可利用N命令來設置而無需退出DEBUG。

例:A:>DEBUG tan.exe

-n youg.pas

當程序偵錯一段時間後,若要把tan.exe裝入tan1.pas則-ntanl.pas

輸出命令

功能:發送字節到指定的輸出端口。

例:當我們遇到開機要求輸入口令時,可用如下方式取消

-O 70 10

_O 71 00

進程命令

功能:将一個子程序調用指令,循環指令,中斷指令或一個重複字符串指令,停止在下一條指令上。

說明:在執行一條子程序調用指令,循環指令,中斷指令或一個重複字符串指令時,發出P命令去執行有關指令,并且返回到要執行的下一條指令。P命令和T一樣選用來跟蹤程序運行過程用的命令,我們可以在P命令中指定程序運行的起始地址,指令個數,如未指定則CS:IP所指定程序的地址開始一次運行一條令。

P與T命令的差别在于P命令把CALL/INT當成一條指令來執行,簡化了跟蹤過程,P命令隻運行RAM内存的命令,而T命令則可運行RAM和ROM裡的程序。

寄存器命令

功能:一,顯示單個寄存器的内容,并提供修改功能。二,顯示所有寄存器内容,再加上字母标志位狀态以及要執行的下一條指令。三,顯示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← 輸入值

命令1

功能:在指定的地址範圍内查找給定的字符串。

說明:用來指定在地址範圍内查找一個字符串,若找到則顯示其地址,否則直接顯示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開始,

跟蹤命令

功能:逐條跟蹤程序的執行,每條指令執行後都将顯示各寄存器的内容。

說明:通常采用跟蹤一條指令,但用戶也可以用指令條數設定一次跟蹤多條指令, 每執行一條指令之後,顯示所有寄存器的内容和标志狀态。

逐條指令跟蹤-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條指令

地址命令

功能:将内存中的内容轉換為彙編語句。

說明:反彙編的字節數取決與用戶的系統顯示形式,以及在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

說明:如指定了範圍則整個範圍全都會被反編譯

寫盤命令

* 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←即可執行此程序

"XD"命令

* "XD"命令:釋放EMS内存

例:-XD 0001

handle 0001 deallocatel←釋放了

利用XD釋放後可再分配

"XM"命令

*"XM"命令;把擴充内存上的内存頁區映射到主内存區

格式:XM RAM 長頁碼 主内存頁碼句柄

例:-XM3 2 0001←把0001号句柄的第3号邏輯頁區映射到2号真實頁區

Logical page 03 mapped to physical page 02

"XS"命令

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

格式 -XS

實際應用

⒈非物理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,随後就可以從71h中得到所需數據。

⑴讀取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 5

相關詞條

相關搜索

其它詞條