天天看點

DEBUG 指令詳解

直接将 8086/8087/8088 記憶碼合并到記憶體。

該指令從彙編語言語句建立可執行的機器碼。所有數值都是十六進制格式,必須按一到四個字元輸入這些數值。在引用的操作代碼(操作碼)前指定字首記憶碼。

a [address]

參數

address

指定鍵入彙編語言指令的位置。對 address 使用十六進制值,并鍵入不以“h”字元結尾的每個值。如果不指定位址,a 将在它上次停止處開始彙編。

有關将資料輸入到指定位元組中的資訊,請參看Debug E(鍵入)。

有關反彙編位元組的資訊,請參看Debug U(反彙編)

說明

使用記憶碼

段的替代記憶碼為 cs:、ds:、es: 和 ss:。遠端傳回的記憶碼是 retf。字元串處理的記憶碼必須明确聲明字元串大小。例如,使用 movsw 可以移動 16 位的字串,使用 movsb 可以移動 8 位位元組串。

彙編跳轉和調用

彙程式設計式根據位元組替換自動将短、近和遠的跳轉及調用彙編到目标位址。通過使用 near 或 far 字首可以替代這樣的跳轉或調用,如下例所示:

-a0100:0500

0100:0500 jmp 502 ; a 2-byte short jump

0100:0502 jmp near 505 ; a 3-byte near jump

0100:0505 jmp far 50a ; a 5-byte far jump

可以将 near 字首縮寫為 ne。

區分字和位元組記憶體位置

當某個操作數可以引用某個字記憶體位置或者位元組記憶體位置時,必須用字首 word ptr 或者字首 byte ptr 指定資料類型。可接受的縮寫分别是 wo 和 by。以下範例顯示兩種格式:

dec wo [si]

neg byte ptr [128]

指定操作數

Debug 使用包括在中括号 ([ ]) 的操作數引用記憶體位址的習慣用法。這是因為另一方面 Debug 不能區分立即操作數和記憶體位址的操作數。以下範例顯示兩種格式:

mov ax,21 ; load AX with 21h

mov ax,[21] ; load AX with the

; contents of

; memory location 21h

使用僞指令

使用 a 指令提供兩個常用的僞指令:db 操作碼,将位元組值直接彙編到記憶體,dw 操作碼,将字值直接彙編到記憶體。以下是兩個僞指令的範例:

db 1,2,3,4,“THIS IS AN EXAMPLE“

db ’THIS IS A QUOTATION MARK:“’

db “THIS IS A QUOTATION MARK:’“

dw 1000,2000,3000,“BACH“

範例

a 指令支援所有形式的間接注冊指令,如下例所示:

add bx,34[bp+2].[si-1]

pop [bp+di]

push [si] )

還支援所有操作碼同義詞,如下例所示:

loopz 100

loope 100

ja 200

jnbe 200

對于 8087 操作碼,必須指定 wait 或 fwait 字首,如下例所示:

fwait fadd st,st(3) ; this line assembles

; an fwait prefix

Debug:C(比較)

比較記憶體的兩個部分。

c range address

參數

range

指定要比較的記憶體第一個區域的起始和結束位址,或起始位址和長度。

address

指定要比較的第二個記憶體區域的起始位址。有關有效 address 值的資訊,請參看“Debug 說明”。

說明

如果 range 和 address 記憶體區域相同,Debug 将不顯示任何内容而直接傳回到 Debug 提示符。如果有差異,Debug 将按如下格式顯示:

address1 byte1 byte2 addess2

範例

以下指令具有相同效果:

c100,10f 300

c100l10 300

每個指令都對 100h 到 10Fh 的記憶體資料塊與 300h 到 30Fh 的記憶體資料塊進行比較。

Debug 響應前面的指令并顯示如下資訊(假定 DS = 197F):

197F:0100 4D E4 197F:0300

197F:0101 67 99 197F:0301

197F:0102 A3 27 197F:0302

197F:0103 35 F3 197F:0303

197F:0104 97 BD 197F:0304

197F:0105 04 35 197F:0305

197F:0107 76 71 197F:0307

197F:0108 E6 11 197F:0308

197F:0109 19 2C 197F:0309

197F:010A 80 0A 197F:030A

197F:010B 36 7F 197F:030B

197F:010C BE 22 197F:030C

197F:010D 83 93 197F:030D

197F:010E 49 77 197F:030E

197F:010F 4F 8A 197F:030F

注意清單中缺少位址 197F:0106 和 197F:0306。這表明那些位址中的值是相同的。

Debug:D(轉儲)

顯示一定範圍記憶體位址的内容。

d [range]

參數

range

指定要顯示其内容的記憶體區域的起始和結束位址,或起始位址和長度。如果不指定 range,Debug 程式将從以前 d 指令中所指定的位址範圍的末尾開始顯示 128 個位元組的内容。

有關顯示寄存器内容的資訊,請參看Debug R(寄存器)。

說明

當使用 d 指令時,Debug 以兩個部分顯示記憶體内容:十六進制部分(每個位元組的值都用十六進制格式表示)和 ASCII 碼部分(每個位元組的值都用 ASCII 碼字元表示)。每個非列印字元在顯示的 ASCII 部分由句号 (.) 表示。每個顯示行顯示 16 位元組的内容,第 8 位元組和第 9 位元組之間有一個連字元。每個顯示行從 16 位元組的邊界上開始。

範例

假定鍵入以下指令:

dcs:100 10f

Debug 按以下格式顯示範圍中的内容:

04BA:0100 54 4F 4D 00 53 41 57 59-45 52 00 00 00 00 00 00 TOM.SAWYER......

如果在沒有參數的情況下鍵入 d 指令,Debug 按以前範例中所描述的内容來編排顯示格式。顯示的每行以比前一行的位址大 16 個位元組(如果是顯示 40 列的螢幕,則為 8 個位元組)的位址開頭。

對于後面鍵入的每個不帶參數的 d 指令,Debug 将緊接在最後顯示的指令後立即顯示位元組内容。

如果鍵入以下指令,Debug 将從 CS:100 開始顯示 20h 個位元組的内容:

dcs:100 l 20

如果鍵入以下指令,Debug 将顯示範圍從 CS 段的 100h 到 115h 中所有位元組的内容:

dcs:100 115

Debug:E(鍵入)

将資料輸入到記憶體中指定的位址。

可以按十六進制或 ASCII 格式鍵入資料。以前存儲在指定位置的任何資料全部丢失。

e address [list]

參數

address

指定輸入資料的第一個記憶體位置。

list

指定要輸入到記憶體的連續位元組中的資料。

有關內建記憶碼的資訊,請參看Debug A(彙編)。

有關顯示記憶體部分内容的資訊,請參看Debug D (轉儲)。

說明

使用 address 參數

如果在沒有指定可選的 list 參數的值情況下指定 address 的值,Debug 将顯示位址和内容,在下一行重複位址,并等待您的輸入。此時,您可以執行下列操作之一:

替換位元組值。為此,請在目前值後鍵入新值。如果您鍵入的值不是有效的十六進制值,或該值包含兩個以上的數字,則 Debug 不會回顯無效或額外的字元。

進入下一個位元組。為此,請按 SPACEBAR(空格鍵)。要更改該位元組中的值,請在目前值後鍵入新值。如果按 SPACEBAR(空格鍵)時,移動超過了 8 位界限,Debug 程式将顯示新的一行并在行首顯示新位址。

傳回到前一個位元組。為此,請按 HYPHEN 鍵 (-)。可以反複按 HYPHEN 鍵 (-) 向後移動超過多個位元組。在按 HYPHEN 時,Debug 開始新行并顯示目前位址和位元組值。

停止執行 e 指令。為此,請按 ENTER 鍵。在任何位元組位置都可以按 ENTER。

使用 list 參數

如果指定 list 參數的值,随後的 e 指令将使用清單中的值替換現有的位元組值。如果發生錯誤,将不更改任何位元組值。

List 值可以是十六進制位元組或字元串。使用空格、逗号或制表符來分隔值。必須将字元串包括在單或雙引号中。

範例

假定鍵入以下指令:

ecs:100

Debug 按下面的格式顯示第一個位元組的内容:

04BA:0100 EB.

要将該值更改為 41,請在插入點鍵入 41,如下所示:

04BA:0100 EB.41_

可以用一個 e 指令鍵入連續的位元組值。在鍵入新值後按 SPACEBAR(空格鍵),而不是按 ENTER 鍵。Debug 顯示下一個值。在此範例中,如果按三次 SPACEBAR(空格鍵),Debug 将顯示下面的值:

04BA:0100 EB.41 10. 00. BC._

要将十六進制值 BC 更改為 42,請在插入點鍵入 42,如下所示:

04BA:0100 EB.41 10. 00. BC.42_

假定決定值 10 應該是 6F。要糾正該值,請按 HYPHEN 鍵兩次以傳回到位址 0101(值 10)。Debug 顯示以下内容:

04BA:0100 EB.41 10. 00. BC.42-

04BA:0102 00.-

04BA:0101 10._

在插入點鍵入 6f 更改值,如下所示:

04BA:0101 10.6f_

按 ENTER 停止 e 指令并傳回到 Debug 提示符下。

以下是字元串項的範例:

eds:100 “This is the text example“

該字元串将從 DS:100 開始填充 24 個位元組

Debug:F(填充)

使用指定的值填充指定記憶體區域中的位址。

可以指定十六進制或 ASCII 格式表示的資料。任何以前存儲在指定位置的資料将會丢失。

f range list

參數

range

指定要填充記憶體區域的起始和結束位址,或起始位址和長度。關于有效的 range 值的資訊,請參看“Debug 說明”。

list

指定要輸入的資料。List 可以由十六進制數或引号包括起來的字元串組成。

說明

使用 range 參數

如果 range 包含的位元組數比 list 中的數值大,Debug 将在 list 中反複指派值,直到 range 中的所有位元組全部填充。

如果在 range 中的任何記憶體損壞或不存在,Debug 将顯示錯誤消息并停止 f 指令。

使用 list 參數

如果 list 包含的數值多于 range 中的位元組數,Debug 将忽略 list 中額外的值。

範例

假定鍵入以下指令:

f04ba:100l100 42 45 52 54 41

作為響應,Debug 使用指定的值填充從 04BA:100 到 04BA:1FF 的記憶體位置。Debug 重複這五個值直到 100h 個位元組全部填滿為止。

Debug:G(轉向)

運作目前在記憶體中的程式。

g [=address] [breakpoints]

參數

=address

指定目前在記憶體中要開始執行的程式位址。如果不指定 address,Windows 2000 将從 CS:IP 寄存器中的目前位址開始執行程式。

breakpoints

指定可以設定為 g 指令的部分的 1 到 10 個臨時斷點。

有關執行循環、重複的字元串指令、軟體中斷或子程式的資訊,請參看Debug P(執行)。

有關執行指令的資訊,請參看Debug T(跟蹤)

Debug:H(十六進制)

對指定的兩個參數執行十六進制運算。

h value1 value2

參數

value1

代表從 0 到 FFFFh 範圍内的任何十六進制數字。

value2

代表從 0 到 FFFFh 範圍内第二個十六進制數字。

說明

Debug 首先将指定的兩個參數相加,然後從第一個參數中減去第二個參數。這些計算的結果顯示在一行中:先計算和,然後計算差。

範例

假定鍵入以下指令:

h19f 10a

Debug 執行運算并顯示以下結果。

02A9 0095

Debug:I(輸入)

從指定的端口讀取并顯示一個位元組值。

i port

參數

port

按位址指定輸入端口。位址可以是 16 位的值。

有關将位元組值發送到輸出端口的資訊,請參看Debug O(輸出)。

範例

假定鍵入以下指令:

i2f8

同時假定端口的位元組值是 42h。Debug 讀取該位元組,并将其值顯示如下:

42

Debug:L(加載)

将某個檔案或特定磁盤扇區的内容加載到記憶體。

要從磁盤檔案加載 BX:CX 寄存器中指定的位元組數内容,請使用以下文法:

l [address]

要略過 Windows 2000 檔案系統并直接加載特定的扇區,請使用以下文法:

l address drive start number

參數

address

指定要在其中加載檔案或扇區内容的記憶體位置。如果不指定 address,Debug 将使用 CS 寄存器中的目前位址。

drive

指定包含讀取指定扇區的磁盤的驅動器。該值是數值型:0 = A, 1 = B, 2 = C 等。

start

指定要加載其内容的第一個扇區的十六進制數。

number

指定要加載其内容的連續扇區的十六進制數。隻有要加載特定扇區的内容而不是加載 debug 指令行或最近的 Debug n(名稱)指令中指定的檔案時,才能使用 drive、start 和 number 參數。

有關指定用于 l 指令的檔案的資訊,請參看Debug n(名稱)。

有關寫入調試到磁盤的檔案的資訊,請參看Debug w(寫入)。

注意

使用不帶參數的 l 指令

當使用不帶參數的 l 指令時,在 debug 指令行上指定的檔案将加載到記憶體中,從位址 CS:100 開始。Debug 同時将 BX 和 CX 寄存器設定為加載的位元組數。如果不在 debug 指令行指定檔案,所裝入的檔案将是最近使用 n 指令經常指定的檔案。

使用具有 address 參數的 1 指令

如果使用帶 address 參數的 l 指令,Debug 将從記憶體位置 address 開始加載檔案或指定扇區的内容。

使用帶全部參數的 l 指令

如果使用帶所有參數的 l 指令,Debug 将加載指定磁盤扇區的内容而不是加載檔案。

加載特定扇區的内容

指定範圍内的每個扇區均從 drive 讀取。Debug 從 start 開始加載,直到在 number 中指定的扇區數中的内容全部被加載。

加載 .exe 檔案

Debug 忽略 .exe 檔案的位址 address 參數。如果指定 .exe 檔案,Debug 将檔案重新定位到 .exe 檔案的标題中指定的加載位址。在 .exe 檔案被加載到記憶體前,标題自身從 .exe 檔案脫離,是以磁盤上的 .exe 檔案大小與記憶體中的不同。如果要檢查整個 .exe 檔案,請使用不同的擴充名重命名檔案。

打開十六進制檔案

Debug 将具有 .hex 擴充名的檔案認為十六進制格式檔案。鍵入不帶參數的 l 指令,可以加載從十六進制檔案中指定的位址處開始的十六進制檔案。如果鍵入的 l 指令包含 address 參數,Debug 将把指定的位址加到在十六進制檔案中找到的位址上,以确定起始位址。

範例

假定啟動 Debug 并鍵入以下指令:

nfile.com

現在可以鍵入 l 指令以加載 File.com。Debug 将加載檔案并顯示 Debug 提示符。

假定需要從驅動器 C 将起始邏輯扇區為 15 (0Fh) 的 109 (6Dh) 個扇區的内容加載到起始位址為 04BA:0100 的記憶體中。為此,請鍵入以下指令:

l04ba:100 2 0f 6d

Debug:M(移動)

将一個記憶體塊中的内容複制到另一個記憶體塊中。

m range address

參數

range

指定要複制内容的記憶體區域的起始和結束位址,或起始位址和長度。

address

指定要将 range 内容複制到該位置的起始位址。

說明

複制操作對現有資料的影響

如果新資料沒有寫入正在被複制的資料塊中的位址,則源資料将保持不變。但是,如果目标塊已經包含資料(就象它在覆寫副本操作中一樣),則将改寫該資料。(覆寫複制操作是指那些目标資料塊部分内容覆寫原資料塊部分内容的操作。)

執行覆寫複制操作

m 指令執行目标位址的覆寫複制操作,而不丢失資料。将改寫的位址内容首先複制。是以,如果将較高位位址的資料複制到較低位位址,則複制操作從原塊的最低位位址開始并向最高位位址進行。反之,如果要将資料從低位址複制到高位址,複制操作從原塊的最高位址開始,向最低位址進行。

範例

假定鍵入以下指令:

mcs:100 110 cs:500

Debug 首先将 CS:110 位址中的内容複制到位址 CS:510 中,然後将 CS:10F 位址中的内容複制到 CS:50F 中,如此操作直至将 CS:100 位址中的内容複制到位址 CS:500 中。要檢視結果,請使用 Debug d(轉儲)指令,并使用 m 指令指定目标位址

Debug:N(名稱)

指定 Debug l(加載)或 w(寫入)指令的可執行檔案的名稱,或者指定正在調試的可執行檔案的參數。

n [drive:][path] filename

要指定測試的可執行檔案的參數,請使用以下文法:

n file-parameters

參數

如果在沒有參數的情況下使用,則 n 指令清除目前規範。

[drive:][path] filename

指定要測試的可執行檔案的位置和名稱。

file-parameters

為正在測試的可執行檔案指定參數和開關。

有關将檔案或指定磁盤扇區的内容加載到記憶體中的資訊,請參看Debug L(加載)。

有關寫入調試到磁盤的檔案的資訊,請參看Debug W(寫入)。

說明

n 指令的兩個用途

可以按兩種方式使用 n 指令。首先,您可以使用它以指定後面的 l(加載)或 w(寫入)指令所使用的檔案。如果在沒有命名所調試檔案的情況下啟動 Debug,必須在使用 l 指令加載檔案之前使用指令 nfilename。在 CS:5C 為檔案控制塊 (FCB) 正确編排檔案名的格式。其次,可以使用 n 指令指定被調試檔案的指令行參數和開關。

記憶體區域

以下四個記憶體區域都會受到 n 指令的影響:

記憶體位置

内容

CS:5C

檔案 1 的檔案控制資料塊 (FCB)

CS:6C

檔案 2 的檔案控制資料塊 (FCB)

CS:80

n 指令行的長度(以字元表示)

CS:81

n 指令行字元的開頭

為 n 指令指定的第一個檔案名被放在 CS:5C 的 FCB 中。如果指定第二個檔案名,此名稱将放置到 CS:6C 的 FCB 中。n 指令行上鍵入的字元數(除第一個字元之外,n)存儲在位置 CS:80。n 指令行上的實際字元(再次,除了字母 n 之外)存儲在以 CS:81 開頭的位置。注意這些字元可以是在 Windows 2000 指令提示符下鍵入的指令中有效的任何開關和分隔符。

範例

假定已經啟動 Debug,并加載了正在調試的程式 Prog.com。接着您決定為 Prog.com 指定兩個參數并運作此程式。以下是此範例的指令序列:

debug prog.com

nparam1 param2

g

在這種情況下,Debug g(轉向)指令會運作該程式,就好像您已在 Windows 2000 指令提示符後鍵入了如下指令:

prog param1 param2

是以,測試和調試反映 Prog.com 通常的運作時間環境。

在下面的指令序列中,第一個 n 指令将 File1.exe 指定為後接的 l(加載)指令的檔案,該指令将 File1.exe 加載到記憶體。第二個 n 指令指定 File1.exe 将使用的參數。最後,g 指令将運作 File1.exe 檔案,就好像您在 Windows 2000 指令行中鍵入了 File1 File2.dat File2.dat 一樣。

nfile1.exe

l

nfile2.dat file3.dat

g

注意

不要在 n 指令的第二種形式後使用 l 指令。還要注意,如果現在使用 w(寫入)指令,Windows 2000 将使用名稱 File2.dat 儲存正在調試的檔案 File1.exe。為避免出現此結果,應該總是在 l 或 w 指令之前立即使用 n 指令的第一種形式。

Debug:O(輸出)

将位元組值發送到輸出端口。

o port byte-value

參數

port

通過位址指定輸出端口。端口位址可以是 16 位值。

byte-value

指定要指向 port 的位元組值。

有關從輸入端口讀取位元組值的資訊,請參看Debug I(輸入)。

範例

要将位元組值 4Fh 發送到位址為 2F8h 的輸出端口,請鍵入以下指令:

o2f8 4f

Debug:P(執行)

執行循環、重複的字元串指令、軟體中斷或子例程;或通過任何其他指令跟蹤。

p [= address] [number]

參數

=address

指定第一個要執行指令的位置。如果不指定位址,則預設位址是在 CS:IP 寄存器中指定的目前位址。

number

指定在将控制傳回給 Debug 之前要執行的指令數。預設值為 1。

有關運作目前在記憶體中程式的資訊,請參看Debug G(轉向)。

有關執行指令的資訊,請參看Debug T(跟蹤)。

說明

控制傳送到要測試的程式

當 p 指令将控制從 Debug 傳送到要測試的程式時,該程式不間斷運作,直到循環、重複字元串指令、軟體中斷或者完成了指定位址的子例程為止,或者直到執行了指定數量的機器指令為止。控制傳回到 Debug。

位址參數的限制

如果 address 參數沒有指定段,Debug 将使用被測試程式的 CS 寄存器。如果省略 address,程式将從 CS:IP 寄存器所指定的位址開始執行。必須在 address 參數之前使用等号 (=) 以便将它與 number 參數區分。如果在指定位址處的指令不是循環、重複的字元串指令、軟體中斷或子例程,則 p 指令與 Debug t(跟蹤)指令的作用相同。

使用 p 指令顯示的郵件

當 p 執行完一段說明後,Debug 顯示出程式的寄存器内容、标志的狀态以及下一段将要被執行的指令的解碼形式。

警告

不能使用 p 指令跟蹤隻讀記憶體 (ROM)。

範例

假定正在測試的程式在位址 CS:143F 處包含一個 call 指令。要運作 call 目标位置的子程式然後将控制傳回到 Debug,請鍵入以下指令:

p=143f

Debug 按以下格式顯示結果:

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=2246 ES=2246 SS=2246 CS=2246 IP=1443 NV UP EI PL NZ AC PO NC

2246:1442 7505 JNZ 144A

Debug:Q(退出)

停止 Debug 會話,不儲存目前測試的檔案。

當您鍵入 q 以後,控制傳回到 DOS 的指令提示符。

q

參數

該指令不帶參數。

有關儲存檔案的資訊,請參看Debug W(寫入)。

Debug:R(寄存器)

顯示或改變一個或多個 CPU 寄存器的内容。

r [register-name]

參數

如果在沒有參數的情況下使用,則 r 指令顯示所有寄存器的内容以及寄存器存儲區域中的标志。

register-name

指定要顯示其内容的寄存器名。

有關顯示記憶體部分内容的資訊,請參看Debug D(轉儲)。

有關反彙編位元組的資訊,請參看Debug U(反彙編)。

說明

使用 r 指令

如果指定了寄存器名稱,Windows 2000 将顯示以十六進制标記表示的寄存器的 16 位值,并将冒号顯示為提示符。如果要更改包含在寄存器中的值,除非鍵入新值并按 ENTER 鍵;否則,請按 ENTER 鍵傳回 Debug 提示符。

有效寄存器名

以下是 register-name 的有效值:ax、bx、cx、dx、sp、bp、si、di、ds、es、ss、cs、ip、pc 及 f。ip 和 pc 都引用指令指針。

如果指定寄存器名稱,而不是從前面的清單中指定,Windows 2000 将顯示以下消息:

br error

使用 f 字元而不是寄存器名

如果鍵入 f 字元代替寄存器名,Debug 将每個标記的目前設定顯示為兩字母代碼,然後顯示 Debug 提示符。要更改标志的設定,請從下表中鍵入适當的兩字母代碼:

标志名

設定

清除

溢出

ov

nv

方向

dn(減)

up(增)

中斷

ei(啟用)

di(禁用)

正負

ng(負)

pl(正)

zr

nz

輔助進位

ac

na

奇偶校驗

pe(偶校驗)

po(奇校驗)

進位

cy

nc

可以按任何順序鍵入新的标志值。不需要在這些值之間留出空格。要停止 r 指令,請按 ENTER 鍵。任何沒有指定新值的标志保持不變。

用 r 指令顯示的郵件

如果為标記指定了多個值,Debug 将顯示以下消息:

df error

如果指定沒有在前面的表中列出的标志代碼,Debug 将顯示以下消息:

bf error

在這兩種情況下,Debug 将忽略所有在無效項目之後指定的設定。

Debug 的預設設定

在啟動 Debug 時,會将段寄存器設定到空閑記憶體的低端,指令指針設定為 0100h,清除所有标志,并且将其餘寄存器設定為零,除了被設定為 FFEEh 的 sp 之外。

Debug:R

範例

要檢視所有寄存器的内容、所有标記的狀态和目前位置的指令解碼表,請鍵入以下指令:

r

如果目前位置是 CS:11A,顯示外觀将類似于以下内容:

AX=0E00 BX=00FF CX=0007 DX=01FF SP=039D BP=0000 SI=005C DI=0000

DS=04BA ES=04BA SS=04BA CS=O4BA IP=011A NV UP DI NG NZ AC PE NC

04BA:011A CD21 INT 21

要隻檢視标志的狀态,請鍵入以下指令:

rf

Debug 按以下格式顯示資訊:

NV UP DI NG NZ AC PE NC - _

現在,您可以按任意順序鍵入一個或多個有效的标志值,其中可以有或沒有空格,如下所示:

nv up di ng nz ac pe nc - pleicy

Debug 結束 r 指令并顯示 Debug 提示符。要檢視更改,請鍵入 r 或 rf 指令。Debug 将顯示以下内容:

NV UP EI PL NZ AC PE CY - _

按 ENTER 傳回到 Debug 提示符。

Debug:S(搜尋)

在某個位址範圍搜尋一個或多個位元組值的模式。

s range list

參數

range

指定要搜尋範圍的開始和結束位址。

list

指定一個或多個位元組值的模式,或要搜尋的字元串。用空格或逗号分隔每個位元組值和下一個位元組值。将字元串值包括在引号中。

說明

如果 list 參數包含多個位元組值,Debug 将隻顯示出現位元組值的第一個位址。如果 list 隻包含一個位元組值,Debug 将顯示指定範圍内出現該值的所有位址。

範例

假定需要查找包含值 41 并且範圍從 CS:100 到 CS:110 的所有位址。為此,請鍵入以下指令:

scs:100 110 41

Debug 按以下格式顯示結果:

04BA:0104

04BA:010D

-

以下指令在 CS:100 到 CS:1A0 的範圍内搜尋字元串“Ph”。

scs:100 1a0 “Ph“

Debug:T(跟蹤)

(SORRY,Debug:T部分暫缺,如果哪位網友有此部分,請通知我)

AoGo補充:

從目前段位址開始執行指定的代碼數,每執行一次顯示所有寄存器(包括标志寄存器)的值。

如:t 10

假設目前在CS:100,那麼将從CS:100開始執行10行代碼,并且将顯示每一行代碼執行後寄存器的變化。)

Debug:U(反彙編)

反彙編位元組并顯示相應的原語句,其中包括位址和位元組值。反彙編代碼看起來象已彙編檔案的清單。

u [range]

參數

如果在沒有參數的情況下使用,則 u 指令分解 20h 位元組(預設值),從前面 u 指令所顯示位址後的第一個位址開始。

range

指定要反彙編代碼的起始位址和結束位址,或起始位址和長度。

有關內建記憶碼的資訊,請參看Debug A(彙編)。

有關顯示記憶體部分内容的資訊,請參看Debug D(轉儲)。

範例

要反彙編 16 (10h) 位元組,從位址 04BA:0100 開始,請鍵入以下指令:

u04ba:100l10

Debug 按以下格式顯示結果:

04BA:0100 206472 AND [SI+72],AH

04BA:0103 69 DB 69

04BA:0104 7665 JBE 016B

04BA:0106 207370 AND [BP+DI+70],DH

04BA:0109 65 DB 65

04BA:010A 63 DB 63

04BA:010B 69 DB 69

04BA:010C 66 DB 66

04BA:010D 69 DB 69

04BA:010E 63 DB 63

04BA:010F 61 DB 61

如果隻顯示從 04BA:0100 到 04BA:0108 特定位址的資訊,請鍵入以下指令:

u04ba:0100 0108

Debug 顯示以下内容:

04BA:0100 206472 AND [SI+72],AH

04BA:0103 69 DB 69

04BA:0104 7665 JBE 016B

04BA:0106 207370 AND [BP+DI+70],DH

Debug:W(寫入)

AoGo:隻對COM有效,因為EXE是帶有重定位資訊的,而Debug無法産生重定位資訊是以無法寫入EXE。

将檔案或特定分區寫入磁盤。

要将在 BX:CX 寄存器中指定位元組數的内容寫入磁盤檔案,請使用以下文法:

w [address]

要略過 Windows 2000 檔案系統并直接寫入特定的扇區,請使用以下文法:

w address drive start number

參數

address

指定要寫到磁盤檔案的檔案或部分檔案的起始記憶體位址。如果不指定 address,Debug 程式将從 CS:100 開始。

drive

指定包含目标盤的驅動器。該值是數值型:0 = A, 1 = B, 2 = C,等等。

start

指定要寫入第一個扇區的十六進制數。

number

指定要寫入的扇區數。

有關指定用于 w 指令的檔案的資訊,請參看Debug N(名稱)。

有關将檔案或檔案扇區内容加載到記憶體中的資訊,請參看Debug L(加載)。

說明

必須在啟動 Debug 時或者在最近的 Debug n(名稱)指令中指定磁盤檔案的名字。這兩種方法都可以将位址 CS:5C 處檔案控制塊的檔案名正确地編排格式。

在使用不帶參數的 w 指令之前重新設定 BX:CX

如果使用了 Debug g(轉向)、t(跟蹤)、p(執行)或 r(寄存器)指令,必須在使用無參數的 w 指令之前,将 BX:CX 寄存器複位。

将修改後的檔案寫入磁盤

如果修改檔案但不更改檔案名、長度或起始位址,Debug 仍然可以正确地将檔案寫入源磁盤位置。

w 指令的限制

不能用該指令寫入 .exe 或 .hex 檔案。

警告

因為略過 Windows 2000 檔案句柄,是以寫入特定的分區非常危險。如果鍵入錯誤的值,則磁盤檔案結構很容易被損壞。

範例

假定要将起始位址為 CS:100 的記憶體内容寫入到驅動器 B 的磁盤中。需要将資料從磁盤的邏輯扇區号 37h 開始并持續 2Bh 個扇區。為此,鍵入以下指令:

wcs:100 1 37 2b

當寫操作完成時,Debug 再次顯示 Debug 提示符。

Debug:XA(配置設定擴充記憶體)

配置設定擴充記憶體的指定頁面數。

要使用擴充記憶體,必須安裝符合 4.0 版的 Lotus/Intel/Microsoft 擴充記憶體規範 (LIM EMS) 的擴充記憶體裝置驅動程式。

xa [count]

參數

count

指定要配置設定的擴充記憶體的 16KB 頁數。

有關使用擴充記憶體的其他 Debug 指令的資訊,請參看Debug XD(釋放擴充記憶體)、Debug XM(映射擴充記憶體頁)或 Debug XS(顯示擴充記憶體狀态)。

說明

如果指定的頁面數可用,則 Debug 将顯示消息,此消息表明所建立的句柄的十六進制數;否則,Debug 将顯示錯誤消息。

Debug:XA

範例

要配置設定擴充記憶體的 8 個頁面,請鍵入以下指令:

xa8

如果指令成功,Debug 将顯示類似的以下消息:

Handle created=0003

Debug:XD(釋放擴充記憶體)

釋放指向擴充記憶體的句柄。

要使用擴充記憶體,必須安裝符合 4.0 版的 Lotus/Intel/Microsoft 擴充記憶體規範 (LIM EMS) 的擴充記憶體裝置驅動程式。

xd [handle]

參數

handle

指定要釋放的句柄。

有關使用擴充記憶體的其他 Debug 指令的資訊,請參看Debug XA(配置設定擴充記憶體)、Debug XM(映射擴充記憶體頁) 或 Debug XS(顯示擴充記憶體狀态)。

範例

要釋放句柄 0003,請鍵入以下指令:

xd 0003

如果指令成功,Debug 将顯示下列消息:

Hdle 0003 deallocated

Debug:XM(映射擴充記憶體頁)

将屬于指定句柄的擴充記憶體邏輯頁映射到擴充記憶體的實體頁。

要使用擴充記憶體,必須安裝符合 4.0 版的 Lotus/Intel/Microsoft 擴充記憶體規範 (LIM EMS) 的擴充記憶體裝置驅動程式。

xm [lpage] [ppage] [handle]

參數

lpage

指定要映射到實體頁 ppage 的擴充記憶體的邏輯頁面号。

ppage

指定将 lpage 映射到的實體頁面号。

handle

指定句柄。

有關使用擴充記憶體的其他 Debug 指令的資訊,請參看Debug XA(配置設定擴充記憶體)、Debug XD(釋放擴充記憶體)或 Debug XS(顯示擴充記憶體)。

範例

要将句柄 0003 的邏輯頁 5 映射到實體頁 2,請鍵入以下指令:

xm 5 2 0003

如果指令成功,Debug 将顯示下列消息:

Logical page 05 mapped to physical page 02

Debug:XS(顯示擴充記憶體狀态)

顯示有關擴充記憶體狀态的資訊。

要使用擴充記憶體,必須安裝符合 4.0 版的 Lotus/Intel/Microsoft 擴充記憶體規範 (LIM EMS) 的擴充記憶體裝置驅動程式。

xs

參數

該指令不帶參數。

有關使用擴充記憶體的其他 Debug 指令的資訊,請參看Debug XA(配置設定擴充記憶體)、Debug XD(釋放擴充記憶體)或Debug XM(映射擴充記憶體頁)。

說明

Debug 顯示的資訊有如下格式:

Handle xx has xx pages allocated

Physical page xx = Frame segment xx

xx of a total xx EMS pages have been allocated

xx of a total xx EMS handles have been allocated

範例

要顯示擴充記憶體資訊,請鍵入以下指令:

xs

Debug 顯示與以下類似的資訊:

Handle 0000 has 0000 pages allocated

Handle 0001 has 0002 pages allocated

Physical page 00 = Frame segment C000

Physical page 01 = Frame segment C400

Physical page 02 = Frame segment C800

Physical page 03 = Frame segment CC00

2 of a total 80 EMS pages have been allocated

2 of a total FF EMS handles have been allocated

------------------------------------------------

    編者:張慶 [email protected]

    QQ:9365822

    Msn:[email protected]

    個人首頁:http://www.why100000.com  (“十萬個為什麼”電腦學習網)

    其他網站:http://sogo99.com  (“搜狗99”網絡門戶)

              http://neteye.blogchina.com  (“網眼”部落格中國)

       2004.12.17