debug命令

debug命令

DEBUG是一個DOS實用程式,是供程式設計師使用的程式調試工具,可以用它檢查記憶體中任何地方的位元組以及修改任何地方的位元組。它可以用於逐指令執行某個程式以驗證程式運行的正確性,也可以追蹤執行過程、比較一個指令執行前後的值以及比較與移動記憶體中數據的範圍,讀寫檔案與磁碟扇區。

基本信息

命令介紹

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

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

debug命令 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

命令功能

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表示運行正常

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

轉儲命令

* 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

G執行命令

功能: 執行正在調試的程式,當達到斷點時停止執行, 並且顯示暫存器標誌和下一條要執行的命令。

說明: 如果沒有指定起始地址,那么當前指令地址由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命令

功能: 將一個檔案或盤的絕對扇區裝入存儲器。

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

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

* N[盤號: ] [路徑] [檔案名稱] [擴展名]

功能: 定義操作檔案名稱。

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

例:A:\>DEBUG tan.exe

-n youg.pas

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

O輸出命令

功能: 傳送位元組到指定的輸出連線埠。

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

-O 70 10

_O 71 00

P進程命令

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

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

P與T命令的差別在於P命令把CALL/INT當成一條指令來執行,簡化了跟蹤過程,P命令只運行RAM記憶體的命令,而T命令則可運行RAM和ROM里的程式。

Q 退出命令

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← 輸入值

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開始,

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條指令

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

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

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

* "XD"命令:釋放EMS記憶體

例:-XD 0001

handle 0001 deallocatel←釋放了

利用XD釋放後可再分配

*"XM"命令;把擴充記憶體上的記憶體頁區映射到主記憶體區

格式:XM RAM 長頁碼 主記憶體頁碼句柄

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

Logical page 03 mapped to physical page 02

*"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,隨後就可以從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

相關詞條

相關搜尋

熱門詞條

聯絡我們