DEBUG的使用方法(译文)

DEBUG的使用方法(译文)- -                                     

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 [list]
例如,-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-
此时,如不修r改其内容可按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 》

有不少朋友来信问过我这样一个问题: 怎样才能成为一名优秀的HACKER。我的回答是: 深入的了解汇编知识,学好DEBUG的用法。这次借Pc life的一角之地,我将详细的讲解一下DEBUG的用法。
   DEBUG是一个DOS实用程序,是供程序员使用的程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。它可以用于逐指令执行某个 程序以验证程序运行的正确性,也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中数据的范围,读写文件与磁盘扇区。

  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

  D,100

  如果输入的命令中出现了错误,DEBUG将在下一行对着错误的位置标记出来,例如:

  -s100 d 12

  ^Error

  DEBUG的命令及功能如下:

  * A[地址] 汇编命令

  功能: 将指令直接汇编成机器码输入到内存中。

  说明: 用于小段程序的汇编及修改目标程序,所有输入的数字均采用十六进制, 用户装入内存的汇编语句是连续存放的,若没有指定地址,并且前面没有使用汇编命令,改语句被汇编到 CS:0100区域。

  

  * C[源地址范围][目的地址]比较命令

  功能: 比较两内存区域中的内容是否相同,若不同则显示其地址和内容。

  

  * D[地址] 或D[起始地址][目的地址] 转储命令

  功能: 以内存映象方式显示内存中的信息。

   说明: 转储用左右两部分显示内存映象内容,左边以十六进制,右边以ASCII字符显示,所有不可打印字符用句号(。)表示。每行显示16个字节的内容,在第八和 第九个字节之间有一个连字符 - 此命令隐含的段地址为DS的值。若未指定起始地址,则D命令从显示的最后一个单元的下一个单元开始显示,若以前没有使用给D命令, 则从初使化的段寄存器的内容,加上地址偏移量 0100H 开始显示。

  

  * E[地址] [字节串) 修改内存命令

  功能: 从指定的地址开始修改内存值。

   说明: 若地址部分只输入偏移量,则 E 命令认为段包括在DS寄存器中。命令格式有两种:其一是用命令中包含的字节串替换从指定的地址开始的多个字节的内容;其二是命令后不跟字节串,则允许按顺 序方式显示和修改字节,按下空格键为显示下一字节内容,若想修改,直接输入相应值。   

  * F[地址范围] [字节或字节串] 填写命令

  功能: 将要填写的字节或字节串填入由地址范围指定的存储器中。

  

  * G[=起始地址] [[断点]......] 执行命令

  功能: 执行正在调试的程序,当达到断点时停止执行, 并且显示寄存器标志和下一条要执行的命令。

  说明: 如果没有指定起始地址,那么当前指令地址由CS,IP寄存器的内容来决定,如果用户指定起始地址就从指定的起始地址开始执行。如果指定断点,当指令到达指令地址时停止执行,并显示各寄存器标志位的内容和下一条要执行的命令,最多允许用户设定10个断点。

  

  * H[数值][数值] 十六进制算术运算命令

  功能: 分别显示两个十六进制数相加的和以及第一个数减去第二个数的差。

  说明: 替用户完成简单的十六进制数的运算。

  

  * I[端口地址]

  功能: 从指定的端口输入并显示(用十六进制)的一个字节。

  

  * L[地址][盘号:][逻辑扇区号][扇区数]

  功能: 将一个文件或盘的绝对扇区装入存储器。

  说明: 单个L命令能够装入的最大扇区数是 80H,其中盘号 0,1,2,3......分别代表 A,B,C,......出现读盘错,显示错误信息。

  

  * M[地址范围][起始地址] 数据传送命令

  功能: 把地址范围内的存储器单元的内容移到起始地址的指定地址中

  说明: 传送期间,源区和目标区可以部分重叠;传送后源区域数据保持不变。

  

  * N[盘号: ] [路径] [文件名] [扩展名]

  功能: 定义操作文件名。

  说明: 可同时定义两个操作文件,并将形成的文件控制块相应的设置在内存 CS:5C和CS:6C上,供以后的L和W命令操作之用。

  

  * O[端口地址][数据] 输出命令

  功能: 发送字节到指定的输出端口。

  

  * P[=地址] [数据] 进程命令

  功能: 将一个子程序调用指令,循环指令,中断指令或一个重复字符串指令,停止在下一条指令上。

  说明: 在执行一条子程序调用指令,循环指令,中断指令或一个重复字符串指令时,发出P命令去执行有关指令,并且返回到要执行的下一条指令。P命令与T 命令有相同的句法。

  

  * Q 退出命令。

  

  * R[寄存器] 寄存器命令

  功能: 一,显示单个寄存器的内容,并提供修改功能。 二,显示所有寄存器内容, 再加上字母标志位状态以及要执行的下一条指令。 三,显示8个标志位状态, 并提供修改功能。   

  * S[地址范围] [字符串]

  功能: 在指定的地址范围内查找给定的字符串。

  说明: 用来指定在地址范围内查找一个字符串,若找到则显示其地址, 否则直接显示DEBUG提示符。隐含地址为DS段值。

  

  * T[=地址][指令条数] 跟踪命令

  功能: 逐条跟踪程序的执行,每条指令执行后都将显示各寄存器的内容。

  说明: 通常采用跟踪一条指令,但用户也可以用指令条数设定一次跟踪多条指令, 每执行一条指令之后,显示所有寄存器的内容和标志状态。

  

  * U[起始地址]或者[地址范围]

  功能: 将内存中的内容转换为汇编语句。

  说明: 反汇编的字节数取决与用户的系统显示形式,以及在U命令中使用的可选项。

  

  * W[地址] [盘符:] [起始扇区] [扇区数] 写盘命令

  功能: 将修改过的数据写到磁盘上。

说明: 可以将指定内存地址开始的数据写在磁盘上,可以在没有指定参数, 或指定地址参数的情况下,将调试文件写在磁盘上。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值