DEBUG主要命令
DEBUG是为汇编语言设计的一种高度工具,它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。??
一、DEBUG程序的调用?
在DOS的提示符下,可键入命令:?
C:\DEBUG [D:][PATH][FILENAME[.EXT]][PARM1][PARM2]?
其中,文件名是被调试文件的名字。如用户键入文件,则DEBUG将指定的文件装入存储器中,用户可对其进行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用DEBUG命令N和L把需要的文件装入存储器后再进行调试。命令中的D指定驱动器PATH为路径,PARM1和PARM2则为运行被调试文件时所需要的命令参数。?
在DEBUG程序调入后,将出现提示符,此时就可用DEBUG命令来调试程序。??
二、DEBUG的主要命令?
1、显示存储单元的命令D(DUMP),格式为:?
_D[address]或_D[range]?
例如,按指定范围显示存储单元内容的方法为:?
-d100 120
18E4:0100 c7 06 04 02 38 01 c7 06-06 02 00 02 c7 06 08 02 G...8.G.....G...
18E$:0110 02 02 bb 04 02 e8 02 00-CD 20 50 51 56 57 8B 37 ..;..h..M PQVW.
7
18E4:0120 8B
其中0100至0120是DEBUG显示的单元内容,左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,·表示不可显示的字符。这里没有指定段地址,D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80个字节的内容。如果完全没有指定地址,则显示上一个D命令显示的最后一个单元后的内容。?
2、修改存储单元内容的命令有两种。?
·输入命令E(ENTER),有两种格式如下:第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为:?
-E address
?
例如,-E DS:100 F3'XYZ'8D?
其中F3,'X','Y','Z'和各占一个字节,该命令可以用这五个字节来替代存储单元DS:0100到0104的原先的内容。?
第二种格式则是采用逐个单元相继修改的方法。命令格式为:?
-E address?
例如,-E DS:100?
则可能显示为:?
18E4:0100 89.-?
如果需要把该单元的内容修改为78,则用户可以直接键入78,再按“空格”键可接着显示下一个单元的内容,如下:?
18E4:0100 89.78 1B.-?
这样,用户可以不断修改相继单元的内容,直到用ENTER键结束该命令为止。?
·填写命令F(FILL),其格式为:?
-F range list?
例如:-F 4BA:0100 5 F3'XYZ'8D?
使04BA:0100~0104单元包含指定的五个字节的内容。如果list中的字节数超过指定的范围,则忽略超过的项;如果list的字节数小于指定的范围,则重复使用list填入,直到填满指定的所有单元为止。?
3)检查和修改寄存器内容的命令R(register),它有三种格式如下:?
·显示CPU内所有寄存器内容和标志位状态,其格式为:?
-R?
例如,-r?
AX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000?
DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=0100 NV UP DI PL NZ NA PO NC?
18E4:0100 C70604023801 MOV WORD PTR [0204],0138 DS:0204=0000?
·显示和修改某个寄存器内容,其格式为:?
-R register name?
例如,键入?
-R AX?
系统将响应如下:?
AX F1F4?
:?
即AX寄存器的当前内容为F1F4,如不修改则按ENTER键,否则,可键入欲修改的内容,如:
?
-R bx?
BX 0369?
:059F?
则把BX寄存器的内容修改为059F。?
·显示和修改标志位状态,命令格式为:?
-RF?系统将响应,如:?
OV DN EI NG ZR AC PE CY-?
此时,如不修改其内容可按ENTER键,否则,可键入欲修改的内容,如:?
OV DN EI NG ZR AC PE CY-PONZDINV?
即可,可见键入的顺序可以是任意的。?
4)运行命令G,其格式为:?
-G[=address1][address2[address3…]]?
其中,地址1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。?
5)跟踪命令T(Trace),有两种格式:?
·逐条指令跟踪?
-T [=address]?
从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。如未指定地址则从当前的CS:IP开始执行。?
·多条指令跟踪?
-T [=address][value]?
从指定地址起执行n条指令后停下来,n由value指定。?
6)汇编命令A(Assemble),其格式为:?
-A[address]?
该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:DEBUG把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如100D。?
7)反汇编命令U(Unassemble)有两种格式。?
·从指定地址开始,反汇编32个字节,其格式为:?
-U[address]?
例如:?
-u100?
18E4:0100 C70604023801 MOV WORD PTR[0204],0138?
18E4:0106 C70606020002 MOV WORD PTR[0206],0200?
18E4:010C C70606020202 MOV WORD PTR[0208],0202?
18E4:0112 BBO4O2 MOV BX,0204?
18E4:0115 E80200 CALL 011A?
18E4:0118 CD20 INT 20?
18E4:011A 50 PUSH AX?
18E4:011B 51 PUSH CX?
18E4:011C 56 PUSH SI?
18E4:011D 57 PUSH DI?
18E4:011E 8B37 MOV SI,[BX]?
如果地址被省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。?
·对指定范围内的存储单元进行反汇编,格式为:?
-U[range]?
例如:?
-u100 10c?
18E4:0100 C70604023801 MOV WORD PTR[0204],0138?
18E4:0106 C70606020002 MOV WORD PTR[0206],0200?
18E4:010C C70606020202 MOV WORD PTR[0208],0202?
或?
-u100 112?
18E4:0100 C70604023801 MOV WORD PTR[0204],0138?
18E4:0106 C70606020002 MOV WORD PTR[0206],0200?
18E4:010C C70606020202 MOV WORD PTR[0208],0202?
?
可见这两种格式是等效的。?
8)命名命令N(Name),其格式为:?
-N filespecs [filespecs]?
命令把两个文件标识符格式化在CS:5CH和CS:6CH的两个文件控制块中,以便在其后用L或W命令把文件装入存盘。filespecs的格式可以是:?
[d:][path] filename[.ext]?
例如,?
-N myprog?
-L?
-?
可把文件myprog装入存储器。?
9)装入命令(Load),有两种功能。?
·把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中。其格式为:
-L[address[drive sector sector]?
·装入指定文件,其格式为:?
-L[address]?
此命令装入已在CS:5CH中格式化了文件控制块所指定的文件。如未指定地址,则装入CS:0100开始的存储区中。?
10)写命令W(Write),有两种功能。?
·把数据写入磁盘的指定扇区。其格式为:?
-W address drive sector sector
·把数据写入指定的文件中。其格式为:?
-W[address]?
此命令把指定的存储区中的数据写入由CS:5CH处的文件控制块所指定的文件中。如未指定地址则数据从CS:0100开始。要写入文件的字节数应先放入BX和CX中。?
11)退出DEBUG命令Q(Quit),其格式为:?
-Q?
它退出DEBUG,返回DOS。本命令并无存盘功能,如需存盘应先使用W命令。
问 题 : 初 学 者 问 一 个 低 级 问 题 ,执 行 debug -a 后 ,如 果 有 一 行 输 入 错 误 ,如 何 更 改 这 一 行 ?
回答:
加 入 进 行 如 下 输 入 :
D:\PWIN95\Desktop>debug
-a
2129:0100 mov ax, 200
2129:0103 mov bx ,200
2129:0106 mov cx, 200
2129:0109
此 时 , 发 现 mov bx, 200一 句 错 误 , 应 为 mov bx, 20, 可 以 敲 回 车 返 回 “ -” 状 态 , 然 后 输 入 :
-a 103
2129:0103 mov bx, 20
如 果 多 或 者 少 若 干 行 , 不 必 重 新 输 入 , 可 以 用 M命 令 移 动 后 面 的 程 序 来 去 掉 或 者 增 加 程 序 空 间 。
DEBUG.EXE指令说明
DEBUG [执行文件名] [执行该文件的外带参数]
a [sta] 编写汇编语言程序的指令,sta为启始地址
c sta end sta2 比较两个储存单元,sta为第一储存单元的启始地址,而end为第一储存单元结束地址,sta2为第二储存单元的启始地址
c sta lnn sta2 比较两储存单元,sta为第一储存单元启始地址,而nn为欲比较的长度大小,sta2为第二储存单元启始地址
d [sta] [end] 显示某指定范围储存单元至屏幕(sta:启始、end:结束)
d [sta] [lnn] 显示某指范围块储存单元至屏幕(sta:启始、nn:长度)
e [sta] 修改储存单元中某一个byte的资料,sta为地址
e [sta] [data] 修改储存单元中某一个byte的资料,data为新资料
g [end] 执行程序,直至结束地址(end)或程序结束时
g=sta [end] 执行从启始(sta)直至结束(end)或程序结束时
r [reg] 显示所有存储器內容或修改某指定存储器(reg)值
t [num] 单步执行,num指定一次执行几步(预设1)
t=sta [num] 单步执行,从sta起始,num指定执行几步(预设1)
n filename 为目前正在编辑或除错的文件命名
w [sta] 储存文件,写入cx个bytes的资料至n指定的文件名
w sta dri sec num 将sta资料写入dri磁盘的第sec磁区共写num个磁区
l [sta] 载入文件,读出n指定文件,档名的资料至sta地址中
l sta dri sec num 读出dri磁盘的第sec磁区的资料至sta共读num个磁区
q 离开debug,返回DOS
u [sta] [end] 反汇编,从sta至end
u [sta] [lnn] 反汇编,从sta,共反汇编nn个bytes
m sta end sta2 将第一储存单元的数据搬至第二储存单元中
m sta lnn sta2 将第一储存单元的数据搬至第二储存单元中
f sta end data 将一段资料(data)存入某指定的储存单元区
f sta lnn data 将nn个bytes的资料存入某指定的储存单元区
s sta end data 搜寻data资料在指定地址內,data不限长度
s sta lnn data 搜寻data资料在指定地址內,data不限长度
h data data2 计算两个资料的和与差并显示在屏幕上
i inport 由输入埠输入并显示一个byte
o outport 由输出埠输出一个byte值