调试程序DEBUG的特点:
在受控环境中测试程序;
装入,显示或修改任何文件;
执行DOS程序;
完成磁盘实际读/写操作;
建立或汇编汇编语言程序。
DEBUG的命令格式: DEBUG [drive:][path][filename][.ext][param...]
其中:
drive: 是DEBUG将要调试的文件所在的磁盘驱动器。
path: 是查找DEBUG将要调试的文件所需的子目录路径,若未指定,DOS使用当前目录。
filename[.ext] 是DEBUG将要调试的文件名。
param 是将被调试的程序(或文件)的命令行参数。
附:
DEBUG所完成的初始化动作,假定文件名没有,启动DEBUG:
段寄存器CS、DS、ES和SS置为DEBUG程序后的第一个段。
指令指针寄存器IP置为100H(程序段前缀PSP后的第一个语句)。
堆栈指针SP置为段末或COMMAND.COM暂驻部分的结束地址(其中较小的那个地址)。
其余通用寄存器均置为0,标志寄存器置为下述状态: NV UP EI PL NE NA PO NC。
如果DEBUG命令行含有文件名,段寄存器DS和ES指向PSP。寄存器BX和CX含有程序长度。
DEBUG使用单字符命令:
命令 | 格式 | 命令 | 格式 |
汇编 | A [地址] | 命名 | N [设备:][路径]文件名[.扩展名] |
比较 | C [范围] | 输出 | O 口地址 |
转出 | D [范围]或[地址] | 继续执行 | P [=地址][值] |
键入 | E 地址[表] | 退出 | Q |
填入 | F 范围表 | 寄存器 | R [寄存器] |
执行 | G [=地址][地址[地址...]] | 搜索 | S 范围表 |
十六进制 | H 值 值 | 跟踪 | T [=地址]或[范围] |
输入 | I 口地址 | 反汇编 | U [地址]或[范围] |
装入 | L [地址][设备扇区,扇区]] | 写 | W [地址[设备扇区,扇区]] |
移动 | M 范围 地址 |
☆显示存储单元的命令D(DEBUG),格式为:
- D [address] 或 - D[range]
例如,按指定范围显示存储单元内容的方法为:
|
说明:
其中0100至0120是DEBUG显示的单元内容。 左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,“.”表示不可显示的字符。这里没有指定段地址, D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80个字节的内容。如果完全没有指定地址,则显示上一个D命令的最后一个单元的内容。
计算机存储信息的基本单位是一个二进制位,一位可存储一个二进制数:0或1。每8位组成一个字节,位编号如下所示:
7
6
5
4
3
2
1
0
在存储器里以字节为单位存储信息。为了正确地存放或取得信息,每一个字节单元给以一个存储器地址。地址从0开始编号,顺序地每次加1。在机器里,地址也是用二进制数来表示的。它是无符号整数,书写格式为十六进制。
16位二进制可以表示2的16次方个字节单元的地址,它可表示的地址范围应该是0-65535。为方便,存储器的容量以2的10次方=1024为基本单位,称为1K。这样,65536个字节单元的存储容量就是64K,其地址编号的范围用16进制数表示为0-FFFFH。如下所示。
0000,0001,0002,……,……,……0009,000A,000B,000C,000D,000E,000F,
0010,0011,0012,……,……,……0019,001A,001B,001C,001D,001E,001F,
0020,0021,0022,……,……,……0029,002A,002B,002C,002D,002E,002F,
…………
FFE0,FFE1,FFE2,……,……,……FFE9,FFEA,FFEB,FFEC,FFED,FFEE,FFEF,
FFF0,FFF1,FFF2,……,……,……FFF9,FFFA,FFFB,FFFC,FFFD,FFFE,FFFF。
一个字存入存储器要占有相继的二个字节,存放时,低位字节存入低地址,高位字节存入高地址,以相反的次序存入的。
存储器的特点:它的内容是取之不尽的。从某个单元取出其内容后,该单元仍然保存着原来的内容不变,可以重复取出,只有存入新的信息之后,原来保存的内容自动丢失。
☆修改存储单元内容的命令有两种
输入命令E(Enter),有两种格式如下:
第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为:
-E address [list]
例如,-E DS:100 F3'XYZ'8D
其中F3,‘X’,‘Y’,‘Z’和8D各占一个字节,该命令可以用这五个字节来替代存储单元DS:0100到0104的原先的容。
第二种格式则是采用逐个单元相继修改的方法。命令格式为:
-E address
例如,-E CS:100
则可能显示为:
18E4:0100 89. -
如果需要把该单元的内容修改为78,则可以直接键入78,再按空格键可接着显示下一个单元的内容,这样可以不断修改相继单元的内容,直到Enter键结束该命令为止。
填写命令F(Fill),其格式为:
-F range list
例如,-F 4BA:0100 5 F3'XYZ'8D
使04BA:0100-0104单元包含指定的五个字节的内容。如果list中的字节数超过指定的范围,则忽略超过的项;如果list的字节数小于指定范围,则重复使用list填入,直到填满指定的所有单元为止。
☆检查和修改寄存器内容的命令R(Register),它有三种格式如下:
显示CPU内所有寄存器内容和标志位状态,其格式为:
-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
其中标志位状态的含义可见下表:
标 志 名
标志为1
标志为0
OF
DF
IF
SF
ZF
AF
PF
CF
溢出(是/否)
方向(减量/增量)
中断(允许/关闭)
符号(负/正)
零(是/否)
辅助进位(是/否)
奇偶(偶/奇)
进位(是/否
OV
DN
EI
NG
ZR
AC
PE
CY
NV
UP
DI
PL
NZ
NA
PO
NC
显示和修改某个寄存器内容,其格式为:
-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
即可,键入的顺序是任意的。
☆运行命令G(Go),其格式为:
-G [=address1][address2[address3 ...]]
其中,地址1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。
☆输入命令I(IN),其格式为:
-I PortAddress
显示指定端口地址的内容
☆输出命令O(OUT),其格式为:
-O PortAddress NewValue
修改指定端口地址的内容
☆跟踪命令T(Trace),有两种格式:
逐条指令跟踪
-T[=address]
从指定地址起执行一条指令后停下来,显示所有寄存器内空及标志位的值。如未指定则从当前的CS:IP开始执行。
多要指令跟踪
-T[=address][value]
从指定地址起执行n条指令后停下来,n由value指定。
☆ 汇编命令A(Assemble),其格式为:
-A [address]
该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:DEBUG把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如100D。
☆反汇编命令U (Unassemble), 有两种格式:
从指定地址开始,反汇编32个字节,其格式为:
-U[address]
例如:
-u 100
18E4:0100 C70604023801 MOV WORD PTR[0204],0138
18E4:0106 C70606020002 MOV WORD PTR[0206],0200
18E4:010C C70608020202 MOV WORD PTR[0208],0202
18E4:0112 BB0402 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]
例如:
-u 100 10C
18E4:0100 C70604023801 MOV WORD PTR[0204],0138
18E4:0106 C70606020002 MOV WORD PTR[0206],0200
18E4:010C C70608020202 MOV WORD PTR[0208],0202
或
-u 100 112
18E4:0100 C70604023801 MOV WORD PTR[0204],0138
18E4:0106 C70606020002 MOV WORD PTR[0206],0200
18E4:010C C70608020202 MOV WORD PTR[0208],0202
这两种格式是等效的。
☆命名命令N(Name),其格式为:
-N filespecs [filespecs]
命令把两个文件标识符格式化在CS:5CH和CS:6CH的两个文件控制块中,以便在其后用L或W命令把文件装入或存盘。
filespecs的格式可以是:[d:][path] filename[.ext]
例如:
-N myprog
-L
-可把文件myprog装入存储器。
☆装入命令L(Load), 有两种功能:
把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中。其格式为:
-L [address drive sector sector_num]
L命令只能读入逻辑扇区,不能读取MBR. 其中, 第一个参数是读入到的地址, 第二个参数是盘号(0=A,1=B,2=C,...), 第三个参数是起始逻辑扇区(从0开始编号的,引导扇区在最开始), 第四个参数是读入的扇区的个数.
装入指定文件,其格式为:
-L [address]
此命令装入已在CS:5CH中格式化了的文件控制块所指定的文件。如未指定地址,则装入CS:0100开始的存储区中。
☆写命令W(Write),有两种功能:
把数据写入磁盘的指定扇区。其格式为:
-W address drive sector sector
把数据写入指定的文件中。其格式为:
-W [write address]
利用R命令在BX CX (CX为低字,BX为高字)中存入程序段的长度(字节数),可以利用R BX 和R CX 要写入文件的修改长度.此命令把指定的存储区中的数据写入由CS:5CH处的文件控制块所指定的文件中。如未指定地址则数据从CS: 0100开始。要写入文件的字节数应先放入BX和CX中。
☆退出DEBUG命令Q(Quit),其格式为:
-Q
它退出DEBUG,返回DOS。本命令无存盘功能,如需存盘应先使用W命令。