DEBUG命令解释及应用(一)

来源:互联网 发布:windows ad域的搭建 编辑:程序博客网 时间:2024/05/29 17:49

                                                                 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区域。
例如
>debug
-a
138B:0100 mov ax,0101
-d100
138B:0100 B8 01 01 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
138B:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 7A 13   ............4.z.
解释: B8 01 01 就是mov ax,0101 语句的机器码 可以用U命令查看反汇编
 
* C[源地址范围][目的地址]比较命令
功能: 比较两内存区域中的内容是否相同,若不同则显示其地址和内容。
例如
-c 100 200 300
138B:0100 B8 00 138B:0300
138B:0101 01 00  138B:0301
138B:0102 01 00 138B:0302
138B:011C 34 00 138B:031C
138B:011E 7A 00 138B:031E
138B:011F 13 00 138B:031F
解释 从138B:0100 --138B:0200 之间 与138B:0300--138B:0400 相对应位置的比较
 
*D[地址] 或D[起始地址][目的地址] 转储命令
功能: 以内存映象方式显示内存中的信息。
说明: 转储用左右两部分显示内存映象内容,左边以十六进制,右边以ASCII字符显示,所有不可打印字符用句号(。)表示。每行显示16个字节的内容,在第八和第九个字节之间有一个连字符 - 此命令隐含的段地址为DS的值。若未指定起始地址,则D命令从显示的最后一个单元的下一个单元开始显示,若以前没有使用给D命令, 则从初使化的段寄存器的内容,加上地址偏移量 0100H 开始显示。
例如
-d100
138B:0100 B8 01 01 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
138B:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 7A 13   ............4.z.
138B:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
138B:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
138B:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
138B:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
138B:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
138B:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

* E[地址] [字节串) 修改内存命令
功能: 从指定的地址开始修改内存值。
说明: 若地址部分只输入偏移量,则 E 命令认为段包括在DS寄存器中。命令格式有两种:其一是用命令中包含的字节串替换从指定的地址开始的多个字节的内容;其二是命令后不跟字节串,则允许按顺序方式显示和修改字节,按下空格键为显示下一字节内容,若想修改,直接输入相应值。
例如
-e 0100
138B:0100 B8.b7
-d100
138B:0100 B7 01 01 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
138B:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 7A 13   ............4.z.
解释:修改了138B:0100为B7
 
* F[地址范围] [字节或字节串] 填写命令
功能: 将要填写的字节或字节串填入由地址范围指定的存储器中。
例如
-f 0100 0103 "ffdd"
-d100
138B:0100 66 66 64 64 00 00 00 00-00 00 00 00 00 00 00 00   ffdd............
138B:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
138B:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
138B:0130  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
解释:修改了138B:0100 --138B:0103 为ffdd

* G[=
起始地址] [[断点]……] 执行命令
功能: 执行正在调试的程序,当达到断点时停止执行, 并且显示寄存器标志和下一条要执行的命令。
说明: 如果没有指定起始地址,那么当前指令地址由CS,IP寄存器的内容来决定,如果用户指定起始地址就从指定的起始地址开始执行。如果指定断点,当指令到达指令地址时停止执行,并显示各寄存器标志位的内容和下一条要执行的命令,最多允许用户设定10个断点。例如
-a
138B:0100 mov ax,0101
138B:010
3 mov ax,FFFF
-gcs:0103
AX=0101 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=138B ES=138B SS=138B CS=138B IP=0103   NV UP EI PL NZ NA PO NC
138B:0103 B8FFFF        MOV     AX,FFFF

* H[
数值][数值] 十六进制算术运算命令
功能: 分别显示两个十六进制数相加的和以及第一个数减去第二个数的差。
说明: 替用户完成简单的十六进制数的运算。

-h 02 04
0006 FFFE
-h 04 02
0006 0002