DEBUG是一个DOS实用程式,是供程式设计师使用的程式调试工具,可以用它检查记忆体中任何地方的位元组以及修改任何地方的位元组。它可以用于逐指令执行某个程式以验证程式运行的正确性,也可以追蹤执行过程、比较一个指令执行前后的值以及比较与移动记忆体中数据的範围,读写档案与磁碟扇区。
基本介绍
- 中文名程式调试工具命令
- 外文名debug
- 性质DOS实用程式
- 作用供程式设计师使用的程式调试工具
- 优点检查记忆体位元组
命令介绍
它的功能包括以下几个方面。
⒈ 直接输入,更改,跟蹤,运行彙编语言源程式;
⒉ 观察作业系统的内容;
3.查看ROM BIOS的内容;
⒋观察更改RAM内部的设定值;
⒌以扇区或档案的方式读写软碟数据
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
如果输入的命令中出现了错误,DEBUG将在下一行对着错误的位置标记出来,例如
-s100 d 12
^Error
命令功能
A 彙编命令
功能 将指令直接彙编成机器码输入到记忆体中。
说明 用于小段程式的彙编及修改目标程式,所有输入的数字均採用十六进制, 用户装入记忆体的彙编语句是连续存放的,若没有指定地址,并且前面没有使用彙编命令,该语句被彙编到 CS:0100区域。
例A>DEBUG
-a 0100
08F10100 MOV AH,09
08F10102 MOV DX,109
08F10105 INT 21H;
08F10107 INT 21H;<-XP下运行cmd debug时,应该是INT 20H,21H会出遇无效指令错误
08F10109 db 'May I help you $'
08F10115←离开a状态
-g ←运行
May I help you 运行结果
Program terminated normally表示运行正常
C比较命令
功能 比较两记忆体区域中的内容是否相同,若不同则显示其地址和内容。
如C40000 3F 100
就是用来比较40000000-4000003F与DS0100-DS013F之间的内容其显示格式如下
记忆体地址1内含值1内含值2记忆体地址2
例比较40000 3F 100内容的差异
-C40000 3F 100
40000000 64 43 08F10100
40000001 3E 69 08F10101 显示内容的差异处
40000002 78 FF 08F10102
……………………………………
如果要比较的範围在DS内,则段地址不必指出
如-C 0 4 100;比较DS0---DS4与DS100---DS104
C命令的另一种格式如下C地址1 L 长度 地址2
如-C0000 L4 0;由00000与与DS0开始比较它同-C00000 3 0命令相等,显示结果如下
00000000 8A C0 08F10000
00000001 10 20 08F10001 它们都比较4个位元组
00000002 1C 00 08F10002
00000003 49 7F 08F10003
D转储命令
D[地址] 或D[起始地址][目的地址] 转储命令
功能 以记忆体映象方式显示记忆体中的信息。
说明 转储用左右两部分显示记忆体映象内容,左边以十六进制,右边以ASCⅡ字元显示,所有不可列印字元用句号(。)表示。每行显示16个位元组的内容,在第八和第九个位元组之间有一个连字元 - 此命令隐含的段地址为DS的值。若未指定起始地址,则D命令从显示的一个单元的下一个单元开始显示,若以前没有使用给D命令, 则从初使化的段暂存器的内容,加上地址偏移量 0100H 开始显示。
例-d10,4f即为显示DS4f的内容在D命令中如不指出段地址,则其默认为DS段。
如指明段地址,则从指明的段地址列出指定的範围
如-dfff000f
我们也可以指定长度来列出所需要记忆体内容
如-d 100 L20即为显示由DS100-DS11F的内容,共20H个位元组
E修改记忆体命令
E[地址] [位元组串)
功能 从指定的地址开始修改记忆体值。
格式E起始地址[数据行]
⑴用给定内容代替指定範围的单元内容
-E地址 内容表
例-E100 41 42 43 44 48 47 46 45
-D 100,L08
08F10100 41 42 43 44 48 47 46 45 ABCDHGFE…
⑵逐个记忆体内容
例-E 100
08F10100 76 42 42是操作员键入
此命令是将原100号记忆体内容76修改为42,用D命令可察看。
F填写命令
F[地址範围] [位元组或位元组串] 填写命令
功能 将要填写的位元组或位元组串填入由地址範围指定的存储器中。
例-f100 120 61 62 63 64
-d100 11f
08F1:0100 61 62 63 64 61 62 63 64 -61 62 63 64 61 62 63 abcd abcd abcd abcd
08F1:0110 13 67 98 E3 C8 2E B3 B6 -03 21 AC 19 3121 4E 96 g……1…
如果数据行超出指定的範围,则填不下的数值会被忽略。
例-f 100 107 41 43 43 44 45 46 47 48 49 4A 4B 4C 4D -d 100,lof
08F10100 41 42 43 44 45 46 47 64 -61 62 63 64 ABCDEFGdabcdabcd
由上例可看出,超出範围的数据被忽略
,F和E命令都可填入字元串
如-F 100 105 "MSDOS"
-d 100 l0f
08F10100 4D 53 44 4F 53 46 47 64 -61 62 63 64 MS DOS FGabcd abcd
G执行命令
功能 执行正在调试的程式,当达到断点时停止执行, 并且显示暂存器标誌和下一条要执行的命令。
说明 如果没有指定起始地址,那幺当前指令地址由CS,IP暂存器的内容来决定,如果用户指定起始地址就从指定的起始地址开始执行。如果指定断点,当指令到达指令地址时停止执行,并显示各暂存器标誌位的内容和下一条要执行的命令,最多允许用户设定10个断点。
例A\>debug tan.exe
-u反编译成彙编语言程码
…………
. .
-g 100 指定中断点
Program terminated normally:
我们在DEBUG下可运行一个档案.EXE
如A\>debug tan.exe
-g
即可开始运行此程式,和在DOS下完全一样
H十六进制算术运算命令
H[数值][数值] 十六进制算术运算命令
功能 分别显示两个十六进制数相加的和以及第一个数减去第二个数的差。
说明 替用户完成简单的十六进制数的运算。
例-h4538 5623
9B5B EF15
I命令
功能 从指定的连线埠输入并显示(用十六进制)的一个位元组。
例-i70
F9;显示70连线埠的内容为F9
I命令可由80X86的64K个连线埠取数据
L命令
功能 将一个档案或盘的绝对扇区装入存储器。
说明 单个L命令能够装入的最大扇区数是 80H,其中盘号 0,1,2,3……分别代表 A,B,C,……出现读盘错,显示错误信息。
⑴格式1.L装入地址 驱动器名 起始扇区/扇区数
这种方式可把磁碟上指定扇区範围的内容装入到存储器从指定地址开始的区域中,在扇区编号引用逻辑/扇区的方式。
例-L 100 0 01,将A驱的0扇区装至CS100上
-d 100 10f
08F1:0100 EB 3C 90 3C 53 44 4F 53 -36 2E 32 32 02 01 01 00.L,MSDOS 6.22……
⑵格式2L装入地址
这种方式可把指定档案装入记忆体,装入的档案可在进入DEBUG时指定亦可用N命令建立,格式为-n档案名称
例1 DEBUG tan.pas
-L 100
例2 DEBUG
-n tan.pas
-L 100
须知L命令只能读取逻辑扇区,不能读取硬碟分区表
L命令中所用的磁碟代码A=00,B=01,C=02……
M数据命令
功能 把地址範围内的存储器单元的内容移到起始地址的指定地址中
说明 传送期间,源区和目标区可以部分重叠;传送后源区域数据保持不变。
例-e100 41 42 43 44 45
-d100 10f
08F10100 41 42 43 44 45 62 62 63 64 -61 62 63 64 61 62 63 64 ABCDEBCDABCDABCD
-M 100 104 110
-d110 L1F
08F10100 41 42 43 45 0A 21 19-20 01 01 20 07 96 87 9F ABCDE……
N命令
N[盘号 ] [路径] [档案名称] [扩展名]
功能 定义操作档案名称。
说明 可定义两个操作档案,并将形成的档案控制块相应的设定在记忆体 CS:5C和CS:6C上,供以后的L和W命令操作之用。我们在运行程式侦错时,在启动DEBUG时在其后加档案程式名以及该程式的参数或运行档案,但当我们侦错一段后,可能装入其它档案来测试,这时我们可利用N命令来设定而无需退出DEBUG。
例A\>DEBUG tan.exe
-n youg.pas
当程式侦错一段时间后,若要把tan.exe装入tan1.pas则-ntanl.pas
O输出命令
功能 传送位元组到指定的输出连线埠。
例当我们遇到开机要求输入口令时,可用如下方式取消
-O 70 10
_O 71 00
P进程命令
功能 将一个子程式调用指令,循环指令,中断指令或一个重複字元串指令,停止在下一条指令上。
说明 在执行一条子程式调用指令,循环指令,中断指令或一个重複字元串指令时,发出P命令去执行有关指令,并且返回到要执行的下一条指令。P命令和T一样选用来跟蹤程式运行过程用的命令,我们可以在P命令中指定程式运行的起始地址,指令个数,如未指定则CSIP所指定程式的地址开始一次运行一条令。
P与T命令的差别在于P命令把CALL/INT当成一条指令来执行,简化了跟蹤过程,P命令只运行RAM记忆体的命令,而T命令则可运行RAM和ROM里的程式。
R暂存器命令
功能 一,显示单个暂存器的内容,并提供修改功能。二,显示所有暂存器内容, 再加上字母标誌位状态以及要执行的下一条指令。三,显示8个标誌位状态, 并提供修改功能。若不想改变则回车即可。
例-r bx
bx 0050
51
-r
AX=0000 BX=0051 CX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0003 ES=0CD3 SS=0CD3 IP=0100 NV UP EI PL NZ NA PO NC
0CD30100 0F DB OF
若想改变标誌暂存器,用-RF回车,则DEBUG会将标誌内容显示出来,若想改变任一标誌,只要输入该标誌的名称即可。
标誌名称 设定 未设定 标誌名称 设定 未设定
滋出 OV(溢出) NV(未溢出) 零位 ZR NZ(不等于零)
方向 DN(减少) UP(增加) 辅助进位 AC NA(无进位)
中断 EI(许可) DI(禁止) 奇偶标誌 PE(偶) PO(奇)
符号 NG(负) PL(正) 进位 CY NC(清除进位)
例-Rf
NV UP EI PL NZ NA PO NC -OV DI← 输入值
S命令
功能 在指定的地址範围内查找给定的字元串。
说明 用来指定在地址範围内查找一个字元串,若找到则显示其地址, 否则直接显示DEBUG提示符。隐含地址为DS段值。
在此记忆体可以用(起始地址)(终止地址)或(起始地址)L(长度)的方式来表示,而字元串与数据行则可混合使用如02.76"BC"。
例-d100 lof
08F1:0100 OF 2A 41 43 0B 31 42 96 -FF F0 B9 8A F3 00 B1.. AC,1B...
-S 100 lof"AC"
08F1:0102← 表示找到,由0102开始,
T跟蹤命令
功能 逐条跟蹤程式的执行,每条指令执行后都将显示各暂存器的内容。
说明 通常採用跟蹤一条指令,但用户也可以用指令条数设定一次跟蹤多条指令, 每执行一条指令之后,显示所有暂存器的内容和标誌状态。
逐条指令跟蹤 -T[=起始地址]
从指定地址起执行一条指令后停下来,显示所有暂存器内容及标誌位的值,如来指定地址则从当前CSIP开始执行。
A\>DEBUG
-A
08F10100 MOV DL,03H
08F10102 MOV AH,02H
08F10104 INT 21H
08F10106 INT 20H
08F10108
-T
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=08F1 ES=08F1 SS=08F1 CS=08F1 1P=0105 NV UP EI PL NZ PO CY
09F10102 B402 MOV AH,02
若指定起始地址,则T命令会从指定的地址开始跟蹤,我们还可以指定跟蹤一次所运行指令的个数,用Ctrl+S暂停萤幕的显示,以便观察。
-t=100 10;由CS100开始跟蹤10条指令
U地址命令
功能 将记忆体中的内容转换为彙编语句。
说明 反彙编的位元组数取决与用户的系统显示形式,以及在U命令中使用的可选项。
⑴从指定地址开始编译,反彙编32个位元组
-U[地址]←从CS100开始,其反彙编32个位元组
如果地址被省略,则从一个U命令的一条指令的下一条单元开始彙编32个位元组。
⑵对指定的存贮範围进行反彙编
-u起始地址 终止地址(L 长度)
例-U 100 109
08F10100 CD20 INT 20
08F10102 FF9F009A CALL FA12[BX+9A00]
08F10106 F0 LOCK
08F10107 FE1D CALL FAR [DI]
08F10109 F0 LOCK
说明如指定了範围则整个範围全都会被反编译
W写盘命令
W[地址] [盘符] [起始扇区] [扇区数] 写盘命令
功能 将修改过的数据写到磁碟上。
说明 可以将指定记忆体地址开始的数据写在磁碟上,可以在没有指定参数, 或指定地址参数的情况下,将调试档案写在磁碟上。
在运行W时需设定档案的大小CX或BX暂存器
⑴把数据写入磁碟的指定扇区
-W 起始地址 驱动器名 起始扇区 扇区数
⑵把数据写入指定档案中
-W 起始地址
例A\>DEBUG
-A
08f10100....
. 写入程式段
08F1: 012A....
-R CX
CX0000
2A←写入位元组数,即为程式结尾地址减起始地址
-n tan.com←设定档案名称,需后缀为com
-w
Wring 002A bytes
-q
A\>TAN←即可执行此程式
"XD"命令
"XD"命令释放EMS记忆体
例-XD 0001
handle 0001 deallocatel←释放了
利用XD释放后可再分配
"XM"命令
"XM"命令;把扩充记忆体上的记忆体页区映射到主记忆体区
格式XM RAM 长页码 主记忆体页码句柄
例-XM3 2 0001←把0001号句柄的第3号逻辑页区映射到2号真实页区
Logical page 03 mapped to physical page 02
"XS"命令
"XS"命令显示当前EMS使用情况。
格式 -XS
实际套用
⒈ 非物理0磁轨坏软碟的修复
此种损坏从软碟盘面上来看并没有明显的划伤和霉变。一般可以恢复其数据,也可使软碟重新在利用。
处理方法如下
Ⅰ. 进入debug
Ⅱ. 取一张引导区没有损坏的好磁碟,插入软碟机
-l 100 0 0 1
Ⅲ. 插入损坏的磁碟到软碟机
-w 100 0 0 1
-q
注意好盘与坏盘容量必须相同
⒉ 物理0磁轨坏软碟中的数据读取
对于0磁轨损坏的磁碟,是应该抛弃了,当你也不妨试一试已下方法
磁化处理用较强的磁铁在靠近坏磁碟的表面处反覆移动,切不可碰到磁碟介质,以免划伤表面,然后在试试格式化。
软碟换面小心的将磁碟打开,坚磁片与金属晶片分开,翻面后再按原来的方法粘在一起即可,在重新格式化。
diskfix对于diskfix想必大家都用的比较多了,里面的磁碟修复功能很好用的。能修复大多数磁碟表面错误。
⒊ 硬碟启动失败处理
在正常机上格式化一张软碟,无其它数据
进入debug
-l 0 2 0 1
-w 0 0 0 1
-q
用系统盘启动故障机后
在进入debug
-l 0 0 0 1
-w 0 2 0 1
-q
⒋ 软碟不能正确读取解决方法
如果使用软碟时出现如下提示
general failure error reading drive a
可以用以下方法解决
将一张好盘插入软碟机
进入debug
-a 100
100 mov al,0
mov cx,1
mov dx,0
mov bx,1000
int 25
int 20
回车
-g=0100
插入坏盘并进入debug
-a 200
100 mov al,1
mov cx,1
mov dx,0
mov bx,1000
int 26
int 20
回车
-g=200
⒌ cmos 数据的保存,恢复
cmosram的’地址口’的口地址为 70h ’数据口’的口地址为 71h 读取时只需将读的cmosram的地址送到70h,随后就可以从71 h中得到所需数据。
⑴读取cmos数据 进入debug
-a 100
100 mov bx,1000
mov cx,0040
mov ax,0000
0109 mov dx,cx
mov cx,0005
010e loop 010e
out 70,al
mov cx,0005
0115 loop 0115
in al,71
mov 【bx】,al
cmp ah,0e
jb 0123
add ah,80
0123 inc ah
inc bx
mov cx,dx
mov al,ah
loop 0109
mov ah,3c
mov dx,0150
mov cx,0020
int 21
mov bx,ax
mov dx,1000
mov cx,0040
mov ah,40
int 21
mov ah,4c
int 21
-a 150
0150 db "cmos.dat",0
0159
-r cx
cx 0000
60
-n save cmos.com
-w
-q
-w 100 2 0 1
-q
⑵恢复cmos数据 进入debug
-a 100
100 mov cx,0150
mov ah,3d
mov al,00
int 21
mov dx,1000
mov bx,ax
mov cx,0040
mov ah,3f
int 21
mov ax,0000
mov bx,dx
mov dx,cx
mov cx,0005
loop 011f
mov al,ah
out 70,al
mov cx,0005
loop 0128
mov al,【bx】
out 71,al
jb 0136
add ah,80
inc ah
inc bx
mov cx,dx
loop 011a
mov ax,0040
mov ds,ax
mov ax,1234
mov 【0072】,ax
jmp ffff:0000
-a 150
0150 db "cmos.dat",0
0159
-r cx
cx 0000
60
-n write cmos.com
-w
-q
⒍ dos 引导扇区数据的保存与恢复
dos引导程式是被读到记忆体0000:7c00初开始执行的
获得正常的引导程式
进入debug
-l 100 2 0 1
-n a:dosboot.com
-r cx
200
-w
-q
装入引导程式
进入debug
-n a:dosboot.com
-l
-r cx
200
-w 100 2 0 1
-q
⒎ 硬碟主引导扇区数据的保存与恢复
硬碟工作正常时读取主引导扇区信息
注意当分区改变时不能用此数据恢复
保存主引导扇区数据进入debug
-a 100
mov ax,0201
mov bx,0110
mov cx,0001
mov dx,0080
int 13
int 3
-g=100
-e 102 3
-e 10e c3
-r bx
bx 0110
0
-r cx
cx 0001
210
-n a:rboot.com
-w
-q
恢复主引导扇区数据只需运行a盘的rboot.com
⒏ 硬碟非分配表备份与恢复
计算机运行正常时分配表备份
进入debug
-l 100 2 0 1
-n a:dbrup.dat
-r cx
200
-w
恢复
进入debug
-n a:dbrup.dat
-l
-w 100 2 0 1
-q
⒐ 硬碟保护卡内幕
对于经常在外边上机的人来说,计算机维护人员一旦设定硬碟保护卡,自己作一些事来特别麻烦,想不想禁止掉硬碟保护卡,用以下方法或许可以借鉴
进入debug
-a 100
mov ah,0
mov dl,0
int 13
-t
一直按t知道找到 cs=f000 记下此时 ds 的值 如1234
-e e04c
34 12 00 f0
-q
⒑ 用debug作硬碟低级格式化
硬碟低级格式化一般用dm,但debug也可以低级格式化硬碟
进入debug
-a 100
mov ax,500
mov bx,180
mov cx,0
mov dx,80
int 13
int 3
-e 180 0 0 0 2
-q
⒒ 冷启动与热启动
用debug实现系统冷启动与热启动程式
冷启动
-a 100
jmp ffff:0
int 20
-n a:reset.com
-r cx
0007
-w
-q
热启动
-a 100
mov ax,0040
mov ds,ax
mov ax,1234
mov si,0072
mov (si),ax
jmp ffff:0
-n a:rset.com
-r cx
0014
-w
-q
⒓ dos内部命令加密
如加密 dir
用pctools或diskedit找 c下的command.com档案
编辑该档案
pctools中f-----f1 然后找所有03 44 49 52 找到后按f5修改成你所要的值 如foo 以后只有输入foo 才能列出档案或档案目录。
diskfix 有良好的界面,操作起来和pctools差不多。
注意如果不能修改,则解开档案的锁定 luck
其它命令代码
type 04 54 59 50 45
cd 02 43 44
del 03 44 45 44
copy 04 43 49 50 59