DEBUG的基本命令的使用[MASM]


DEBUG的基本命令的使用

DEBUG是專門為匯編語言設計的一種調試工具,它通過步進,設置斷點等方式為匯編語言程序員提供了非常有效的調試手段。

DEBUG的命令都是一個字母,后跟一個或多個參數:字母 [參數]

命令的使用中注意:

① 字母不分大小寫;

② 只使用16進制數,沒有后綴字母;

③ 分隔符(空格或逗號)只在兩個數值之間是必須的,命令和參數間可無分隔符;

④ 每個命令只有按了回車鍵后才有效,可以用Ctrl+Break中止命令的執行;

⑤ 命令如果不符合Debug的規則,則將以“error”提示,並用“^”指示錯誤位置。

許多命令的參數是主存邏輯地址,形式是段基地址 : 偏移地址。其中,段基地址可以是段寄存器或數值;偏移地址是數值。如果不輸入段地址,則采用默認值,可以是缺省段寄存器值。如果沒有提供偏移地址,則通常就是當前偏移地址。

對主存操作的命令還支持地址范圍這種參數,它的形式是:開始地址 結束地址(結束地址不能具有段地址),或者是:開始地址 L字節長度

DEBUG命令一覽:

分類

命令格式

功能簡介

讀寫寄存器

R

顯示所有寄存器的當前內容

R寄存器名

顯示和修改指定寄存器內容

RF

顯示和修改標志寄存器內容

匯編和反匯編

A[內存地址]

從指定地址開始匯編指令

U[內存塊]

對指定內存塊進行反匯編

執行指令

T[:內存地址][條數]

單步或多步執行指令(進入過程)

P[=內存地址][條數]

單步或多步執行指令(不進入過程)

G[=內存地址]

連續執行指令

G[=內存地址]斷點地址

設斷點執行程序

讀寫內存

D[內存塊]

顯示指定內存塊內容

E 內存地址 字符或數值串

修改指定內存內容

F 內存塊 字符或數值串

填充指定內存塊

S 內存塊 字符串或數值

在指定內存塊中查找串

M 內存塊1 內存塊2的首地址

復制內存塊內容

C 內存塊1 內存塊2的首地址

比較兩個指定內存塊

讀寫磁盤

N[d][path]文件名.擴展名

指定欲讀寫的磁盤文件

W 內存地址

將指定內存塊寫入文件

L [內存地址]

將文件調入內存

讀寫I/O端口

I 端口地址

讀入指定端口的內容

O 端口地址  數值

將數據寫入指定端口

十六進制加減

H 數值1 數值2

計算並顯示兩數之和,兩數之差

退出DEBUG

Q

退出DEBUG,返回DOS

1、DEBUG程序的啟動

DOS提示符下,可鍵入命令:

C:\>DEBUG↙

DEBUG命令的完整格式為:DEBUG [d:][path][文件名][ 參數1][參數2]。其中[d:]是盤符,[path]是路徑,文件名是被調試文件的名稱,它須是執行文件(EXE),兩個參數是運行被調試文件時所需要的命令參數,在DEBUG程序調入后,出現提示符“-”,此時,可鍵入所需的DEBUG命令。

在啟動DEBUG時,如果輸入了文件名,則DEBUG程序把指定文件裝入內存。用戶可以通過DEBUG的命令對指定文件進行修改、顯示和執行。如果沒有文件名,則是以當前內存的內容工作,或者用命名命令和裝入命令把需要的文件裝入內存,然后再用DEBUG的命令進行修改、顯示和執行。

2、DEBUG的主要命令

(1)、檢查和修改寄存器內容的命令R,它有三種方式:

1)顯示CPU內部所有寄存器內容和標志位狀態,格式為:-R

例如:輸入-R↙,得到結果如下:

 

2)顯示和修改某個指定寄存器內容,格式為:-R 寄存器名

例如:輸入-R AX,得到結果如下:

 

表示AX當前內容為0000,此時若不對其作修改,可按ENTER鍵,否則,輸入修改內容后,如:

AX內容由0000改為0A0A

3)R命令顯示標志寄存器標志位狀態的含義如下表所示:

標 志 名

置  位(值為1)

復  位(值為0)

溢出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

修改標志位狀態,命令格式為:-RF

例如:輸入-RF,輸出結果如下:

 

這時若不作修改可按ENTER鍵,否則在“-”號之后鍵入修改值,鍵入順序任意。如:

 

(2)、匯編命令A,格式為:-A[地址]

該命令從指定地址開始允許輸入匯編語句,把它們匯編成機器代碼相繼存放在從指定地址開始的存儲器中。A命令中如果沒有指定地址,則接着上一個A命令的最后一個單元開始;若還沒有使用過A命令,則從當前CS : IP開始。

例如:輸入代碼,則代碼存儲在OAFO:0100至OAFO:010D單元中。

 

(3)、反匯編命令U,有兩種格式:

1)-U[地址]

該命令從指定地址開始,反匯編32個字節,若地址省略,則從上一個U命令的最后一條指令的下一個單元開始顯示32個字節。

 

2)-U范圍

該命令對指定范圍的內存單元進行反匯編,例如:

-U 0100 011E或-U 100 11E 或-U 0AF0:0100 011E或–U 0AF0:0100 L1F(L用來引導指令的條數,1F為指令的條數),這些命令是等效的。

 

 

(4)、運行命令G,格式為:

-G [=地址1][地址2]

其中地址1規定了運行起始地址,后面的地址為斷點地址。若省略地址,則運行從IP所指的地址開始。例如:

 

(5)、追蹤命令T,有兩種格式:

1)逐條指令追蹤:

-T

該命令從指定地址起執行一條指令后停下來,顯示寄存器內容和狀態值。例如:

 

2)多條指令追蹤:(有問題)

-T[=地址][值]

該命令從指定地址起執行n條命令后停下來,n由[值]確定。

(6)、顯示內存單元內容的命令D,格式為:

-D[地址](從給出的地址開始連續顯示128個字節的單元內容)或-D[范圍],例如:

 

(7)、修改內存單元內容的命令E,它有兩種格式:

1)用給定的內容代替指定范圍的單元內容:

-E地址  內容表

 例如:-E 2000:0100  F3 “XYZ” 8D

其中F3,“X”“Y”“Z”和8D各占一個字節,用這五個字節代替原內存單元2000:0100到0104的內容,“X”“Y”“Z”將分別按它們的ASCII碼值代入。

 

2)逐個單元相繼地修改:

-E地址

例如:-E 100:

0AF0:0100 F3.E7

此命令是將原100號單元的內容F3改為E7。E7是鍵入值。

 

(8)、命名命令N,格式為:

-N 文件名

此命令將文件名格式化在CS:5CH的文件控制塊內,以便使用L或W命令把文件裝入內存進行調試或者存盤。例如:

 

(9)、裝入命令L,它有兩種功能:

1)把磁盤上指定扇區的內容裝入到內存指定地址起始的單元中,格式為:

-L  地址  驅動器  扇區號  扇區個數

2)裝入指定文件,格式為:

-L [地址]

此命令裝入已在CS:5CH中格式化的文件控制塊所指定的文件。

在用L命令前,BX和CX中應包含所讀文件的字節數。

3)裝入已在文件控制塊中的文件,格式為:

-L

此命令與-L [地址]相同功能。

(10)、寫命令W,有兩種格式:

1)把數據寫入磁盤的指定扇區:

-W  地址  驅動器  扇區號  扇區數

2)把數據寫入指定文件中:

-W  [地址]

此命令把指定內存區域中的數據寫入由CS:5CH處的FCB所規定的文件中。在用W命令前,BX和CX中應包含要寫入文件的字節數。

(11)、十六進制運算命令H,格式為:

H [數據1] [數據2]

其功能是將兩個十六進制數進行相加、相減運算,結果顯示在屏幕上。例如:

 

(12)、退出DEBUG命令Q,該命令格式為:

-Q

它退出DEBUG程序,返回DOS,但該命令本身並不把在內存中的文件存盤,如需存盤,應在執行Q命令前先執行寫命令W。

 

附二.DEBUG32的重要擴展命令的使用

1)、R16/R32更換寄存器顯示位數命令

  R16 設置 16 bit 顯示模式

 

  R32設置 32 bit 顯示模式

 

2CLS清屏命令

 

D 查看數據內容指令:

D 命令——查看內存單元

前面我們學到,內存每 16 個字節單元為一小段,邏輯段必須從小段的首址開始。用 D 命令可以查看存儲單元的地址和內容。

D 命令格式為:

D 段地址:起始偏移地址 [結尾偏移地址] [L范圍] 

例如:

D DS:0      查看數據段,從 0 號單元開始
D ES:0        查看附加段,從 0 號單元開始
D DS:100    查看數據段,從 100H 號單元開始
D 0200:5 15     查看 0200H 段的 5 號單元到 15H 號單元(在虛擬機上該命令不能執行)
D 0200:5 L 11   用 L 選擇范圍。查看 0200H 段的 5 號單元到 15H 號單元共 17 個單元

 

 

圖中第一條 D 命令顯示的是數據段存儲單元的內容,可以看到數據段的段地址為 DS,其值 0B05H。0 號單元的內容為 CDH,1 號單元為 20H ,...,第 15 號單元的內容為 03H;第二行 0010H 號(16 號)單元的內容為 69H,它是小寫字母 i 的 ASCII 碼,因此右邊區域中顯示了 i ,表示該單元的值 69H 可以看成 ASCII 碼。

 

第二條 D 命令顯示 0200H 段中的內容,也是從 0 號單元開始。

 

第三條 D 命令從 0200H 段的 5 號單元開始顯示直到 15H 號單元。

 

如果在 D 后面直接寫出偏移地址,則顯示當前數據段下偏移地址開始的內存單元,如:

 

D 10 從數據段10H號單元開始顯示 D100 從數據段100H號單元開始顯示 

 

注意:多次鍵入 D,可連續顯示后面的單元內容

 

 

 

用 D DS:0 命令顯示后,可以看到,這三個單元的值由原來的 9F 00 9A 修改為 14 15 16。

如果 E 后面直接跟偏移地址,則修改當前數據段下偏移地址所指單元值;還可以用 E 命令修改其它段的存儲單元內容。

E 10 修改當前數據段10H號單元內容 E ES:100 修改附加段100H號單元內容 D ES:100 查看一下100H單元的內容是否修改了

 

 

U 后跟偏移地址,則從該地址開始反匯編。如:

 

U 0 從代碼段0號單元開始反匯編 U100 從代碼段100H號單元開始反匯編 

 

需要注意的是,圖 2-22 中顯示的程序代碼並不是用戶編寫的程序,因為在輸入 DEBUG 命令時沒有寫用戶程序名.EXE。這段程序代碼是系統代碼段中保存的內容,有可能是系統程序,也有可能是無效的代碼。

 

(5)A 命令——輸入匯編指令

 

在 DEBUG 中,使用 A 命令可以輸入匯編指令,系統自動地將鍵入的匯編指令翻譯成機器代碼,並相繼地存放在從指定地址開始的存儲區中。由於 DEBUG 下的數值默認為十六進制數,因此先要將十進制數轉換成十六進制數。

 

例如,第 1 章提到的計算 Z = 35 + 27 的匯編指令為:

 

MOV AX,23H ADD AX,1BH MOV [0000],AX 

 

加法的結果 Z=62=3EH。變量 Z 用存儲單元[0000]表示。這三條指令可在 DEBUG 下用 A 命令直接輸入。輸入 A 命令后,系統自動地給出邏輯地址為 0AEE:0100(CS:偏移地址),在其后輸入匯編指令,回車后可輸入下一條指令,直接回車則退出輸入

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM