1、如何调用DEBUG程序
语法格式:DEBUG [驱动器名:][路径][文件名]
如有文件名,则将指定的文件调入内存。
如命令中没有指定文件名,则DEBUG可以与正在内存中的内容打交道。DEBUG程序调入后,出现提示符“_”,说明现在系统在DEBUG程序的管理下,所有DEBUG命令只有在出现提示符后才有效。
2、DEBUG对寄存器和标志位的初始化
指令指针寄存器(IP)置为0100H。
AX、BX、CX、DX、BP、SI、DI置为0。若DEBUG调入时指定了文件名,则BX:CX中包含以字节表示的文件长度。
标志清零。
3、有关DEBUG命令的一些共同信息
所有命令都是一个字母,后面跟一个或多个参数,数据是十六进制数;
命令和参数大、小写等价;
命令和参数之间可以用定界符,两个相邻的十六进制数之间必须使用定界符;
按Ctrl+Break可以中止一个命令的执行;
DEBUG可以检查语法错误。
4、显示内存单元内容的命令
格式:D[地址] 或 D[范围]
功能:检查指定范围的存储单元的内容,分两种方式显示。
例:d 2000:0100 d d100 des:0 d1000:0100 02ff
5、修改存储单元内容的命令
用命令中给定的内容表去代替指定范围的内存单元的内容。
格式:E 地址 内容表
例:e ds:100 f3’abc’8d
e 100 30 31 32 33 34 35 36 37
d 100
逐个单元连续修改。
格式:E 地址
E2000:100
填写命令
格式:F 范围 内容表
范围:由起始地址和结束地址组成。
例:f ds:0 8 ‘abc’
检查和修改寄存器内容的命令
格式1:R
功能:显示所有寄存器的内容和全部标志位的状态。
格式2:R 寄存器名
功能:显示和修改一个指定寄存器的内容。
格式3:RF
功能:显示和修改所有标志位的状态。
6、汇编命令A
格式:A[地址]
功能:将用户输入的汇编语言的语句汇编成机器码,存放在指定地址开始的存储单元中。若没有指定地址,则接着上一个汇编命令的最后一个单元开始存放;若前面没有用过汇编命令,则从(CS):100H单元开始存放。
注:Debug不能确定某些操作数涉及到的是字单元还是字节单元,必须用前缀来说明数据类型。
7、跟踪命令T
格式:T[=地址][n]
功能:从指定地址开始(若没有指定地址则从现行的CS:IP处)执行n条指令后停下来,显示每条指令执行完后的所有寄存器和标志位的状态。
8.反汇编命令U
① U [地址];从指定地址开始反汇编32个字节的机器指令;省略地址时,则接着上一个U命令的最后一个单元开始;若第一次使用U命令省略地址,则从当前CS:IP开始(通常是CS:100)。
② U 范围;对指定范围的单元进行反汇编。
-U
-U100
-U100L10
9.运行程序命令G
① G;从CS:IP指向的指令开始执行程序,直到程序结束或遇到INT 3。
② G=地址;从指定地址开始执行程序,直到程序结束或遇到INT 3。
③ G 断点;从CS:IP指向的指令开始执行程序,直到遇到断点。
④G=地址 断点
-G ;从CS:IP指向的指令开始执行程序。
-G=100 ;从指定地址开始执行程序。 -G=100 120
更详细的补充:
进入后显示’-’,CS、DS、ES、SS四个段寄存器值相等(每次进入不一定相等,取决于系统及内存驻留程序的多少),除IP=0100H、SP=FFEEH,其它通用寄存器值均为0,PSW的初值为NV、UP、EI、PL、NA、PO、NC。特别要注意CS:IP代表下一条待执行的指令的默认起始,SS:SP为栈顶地址,涉及串操作时DS:SI代表源串的起始地址,ES:DI代表目的串的起始地址,涉及文件操作时BX、CX代表文件长度(BX为高16位,CX为低16位),内存变量在DEBUG中必须用其他寻址方式替代(一般用直接偏移量表示)。练习各条常用DEBUG命令的使用,要求熟悉英文缩写及单词。
1、 -? ; 显示如下(命令英文全称,命令,参数表)(中括号代表可省略,下同)
assemble A [address]
compare C range address
dump D [range]
enter E address [list]
fill F range list
go G [=address] [addresses]
hex H value1 value2
input I port
load L [address] [drive] [firstsector] [number]
move M range address
name N [pathname] [arglist]
output O port byte
proceed P [=address] [number]
quit Q
register R [register]
search S range list
trace T [=address] [value]
unassemble U [range]
write W [address] [drive] [firstsector] [number]
allocate expanded memory XA [#pages]
deallocate expanded memory XD [handle]
map expanded memory pages XM [Lpage] [Ppage] [handle]
display expanded memory status XS
2、 显示和修改寄存器的内容的命令R的用法:-R[积存器名| F]
-R ; 这可显示所有寄存器的内容,包括标志寄存器的内容,以及当前CS:IP处的一条指令的机器码和汇编指令,还有涉及到的存储单元内容。如:
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=119D ES=119D CS=119D IP=0100 NV UP EI PL NZ NA PO NC
119D:0100 B83412 MOV AX,1234
除PSW外其余寄存器均显示为16进制数据,PSW各标志位的置位/复位(1/0)分别为:
OF: OV/NV(Overflow/No Overflow)
DF: DN/UP(Down/Up)
IF: EI/DI(Enable Interrupt/Disable Interrupt)
SF: NG/PL(Negative/Positive)
ZF: ZR/NZ(Zero/Not Zero)
AF: AC/NA(Auxiliary Carry/No Auxiliary Carry)
PF: PE/PO(Parity Even/Parity Odd)
CF: CY/NC(Carry/No Carry)
-R 寄存器名或标志F ; 修改指定寄存器或标志位的内容,如:
-R BX
BX 0369
: ; 若不修改,可按ENTER键,否则在冒号后输入要修改的内容如059F回车,则BX的内容有0369修改为059F。
-RF
NV UP EI PL NZ NA PO -CY ZR ; 则NC改为CY,NZ改ZR(无序)
内存数据内命令主要有以下三个D、E、F。
3、 显示内存单元的内容命令格式:
-D[[段地址:]起始偏移 [终止偏移]] ; 显示指定范围的内存单元内容,如:
-D
0BB4:0100 2E F6 06 56 91 40 74 0F-26 F7 47 02 20 00 74 07 ...V.@t.&.G. .t.
0BB4:0110 26 80 7E 00 00 74 22 26-F7 07 10 00 34 00 A3 0B &.~..t"&....4...
0BB4:0120 75 09 26 80 7E 00 00 75-0D EB 0E 3C 00 75 07 26 u.&.~..u...<.u.&
0BB4:0130 80 7E 00 3A 74 03 F9 EB-06 2E 89 36 59 91 F8 5E .~.:t......6Y..^
0BB4:0140 5A 5D 58 C3 50 51 52 56-53 56 E8 AA 00 5E 2E C7 Z]X.PQRVSV...^..
0BB4:0150 06 08 92 00 00 2E C7 06-0A 92 00 00 2E C7 06 0C ................
0BB4:0160 92 00 00 E8 AD 00 72 18-2E A3 08 92 0A DB 74 1A ......r.......t.
0BB4:0170 E8 A0 00 72 6E 2E A3 0A-92 0A DB 74 0D E8 93 00 ...rn......t....
(默认从当前段及偏移地址开始,显示内存单元的128个字节的内容,每行16个字节。显示出内容的格式为:内存起始段地址:偏移地址,16个字节的16进制数据,对应ASCII字符)
4、 修改内存单元的内容: -E[段地址:]起始偏移 [修改内容列表],如:
-E 0100 “ABCD” 或 –E 0100 41 42 43 44
将0100H起始偏移单元的内容修改为41H、42H、43H、44H。
-E 100 ; 省略内容列表,边显示边修改
136C:0100 3C.41 3E.42 75.43 70.44
5、 填充内容列表: -F[段地址:]起始偏移 终止偏移 填充内容列表,如:
-F 0200 0300 “AB” ; 将偏移地址从0200H到0300H单元的内容都填充为ABAB......AB
内存程序类命令主要有以下5个:A、U、T、P、G。这类指令地址断位一定要准确,否则可能将一条指令拆开造成程序乱套。
6、 编写/修改汇编语句: -A[[段地址:]起始偏移],如:
-A100
0BB4:0100 MOV AX,829F
0BB4:0103 MOV BX,2C78
0BB4:0106 ADD AX,BX
0BB4:0108 HLT
0BB4:0109
7、 反汇编命令: -U[[段地址:]起始偏移 [终止偏移]] ; 将指定地址范围的机器码反汇编成汇编指令。如:
-U100
0BB4:0100 B89F82 MOV AX,829F
0BB4:0103 BB782C MOV BX,2C78
0BB4:0106 01D8 ADD AX,BX
0BB4:0108 F4 HLT
0BB4:0109 F747022000 TEST WORD PTR [BX+02],0020
0BB4:010E 7407 JZ 0117
0BB4:0110 26 ES:
0BB4:0111 807E0000 CMP BYTE PTR [BP+00],00
0BB4:0115 7422 JZ 0139
0BB4:0117 26 ES:
0BB4:0118 F7071000 TEST WORD PTR [BX],0010
0BB4:011C 3400 XOR AL,00
0BB4:011E A30B75 MOV [750B],AX
(未指定终止偏移共显示13行,段地址:偏移地址 机器码 汇编指令)
8、 单步跟踪进入命令: -T[=[段地址:]起始偏移] [指令条数] ; 默认为一条指令,该命令可从指定地址起执行指定条数指令后停下来,每条指令执行后均会显示寄存器内容和状态值。如:
-R ; 显示当前寄存器、标志位及当前指令
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0BB4 ES=0BB4 SS=0BB4 CS=0BB4 IP=0100 NV UP EI PL NZ NA PO NC
0BB4:0100 B89F82 MOV AX,829F
-T ; 执行当前一条指令MOV AX,829F,即将829FH送AX,标志位不变
AX=829F BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0BB4 ES=0BB4 SS=0BB4 CS=0BB4 IP=0103 NV UP EI PL NZ NA PO NC
0BB4:0103 BB782C MOV BX,2C78
-T ; 执行当前一条指令MOV BX,2C78,即将2C78H送BX,标志位不变
AX=829F BX=2C78 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0BB4 ES=0BB4 SS=0BB4 CS=0BB4 IP=0106 NV UP EI PL NZ NA PO NC
0BB4:0106 01D8 ADD AX,BX
-T ; 执行当前一条指令ADD AX,BX,即将AX加BX送AX,标志位相应改变
AX=AF17 BX=2C78 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0BB4 ES=0BB4 SS=0BB4 CS=0BB4 IP=0108 NV UP EI NG NZ AC PE NC
0BB4:0108 F4 HLT
9、单步跟踪跳过命令: -P[=[段地址:]起始偏移] [指令条数] ; 默认为一条指令,该命令可从指定地址起执行指定条数指令后停下来,每条指令执行后均会显示寄存器内容和状态值。与上一条T命令相比最主要的不同是遇到CALL及INT指令时是否进入子程序内部,T会进入,P不会进入,当成一条指令一次完毕。所以在调试程序时,若子程序需要调试则用T进入,否则用P跳过以节省时间。
10、连续运行命令: -G[=[段地址:]起始偏移] [偏移2 [偏移3 […]]]
起始偏移规定了运行的起始偏移地址,后面的若干偏移均为断点地址。如:
-G=100 108 ; 从100H处连续执行到108H处,不包括108H处指令
AX=AF17 BX=2C78 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0BB4 ES=0BB4 SS=0BB4 CS=0BB4 IP=0108 NV UP EI NG NZ AC PE NC
0BB4:0108 F4 HLT
以下三个命令M、C、S既可用于内存数据处理也可用于内存程序处理。注意:内存中的内容既可看成数据也可看成程序,程序是一种特殊的数据而已。程序是由指令构成,指令包含若干个字节的数据。
11、移动内存数据或程序: -M[段地址:]起始偏移 终止偏移 目的偏移,如:
-C0200 021F 0300 ; 将从偏移0200H到021FH单元的内容与0300H到031FH中共32个字节的内存相比较,对应不同时显示它们的地址,相同时则不显示。
-C200 21F 300
0BB4:0207 1F 0E 0BB4:0307
0BB4:0208 B8 92 0BB4:0308
0BB4:0209 00 0A 0BB4:0309
0BB4:020A 38 DB 0BB4:030A
0BB4:020B 8B 75 0BB4:030B
0BB4:020C D6 57 0BB4:030C
0BB4:020D CD 2E 0BB4:030D
0BB4:020E 21 A1 0BB4:030E
0BB4:020F 58 08 0BB4:030F
0BB4:0210 5A 92 0BB4:0310
0BB4:0211 1F 0A 0BB4:0311
0BB4:0212 C3 E4 0BB4:0312
0BB4:0213 51 75 0BB4:0313
0BB4:0214 52 4F 0BB4:0314
0BB4:0215 33 2E 0BB4:0315
0BB4:0216 C9 F6 0BB4:0316
0BB4:0217 2E 06 0BB4:0317
0BB4:0218 8A 55 0BB4:0318
0BB4:0219 04 91 0BB4:0319
0BB4:021A 0A 01 0BB4:031A
0BB4:021B C0 74 0BB4:031B
0BB4:021C 74 08 0BB4:031C
0BB4:021E 2E 0C 0BB4:031E
0BB4:021F 80 77 0BB4:031F
13、查找内存数据或程序: -S[段地址:]起始偏移 终止偏移 查找内容列表,如:
-S200 300 "A"
0BB4:02C1 ; 从偏移0200H到0300H单元的内容依次与”A”即41H相比较,相同则显示它们的地址,否则不显示。
以下两个命令L、W主要与外存打交道,可以为磁盘的扇区也可以为文件。N用于文件取名或指定。
N命令的格式为: -N[盘符][路径]文件名
15、将磁盘扇区内容或文件内容装入内存的命令L,L命令的格式为:
-L[[段地址:]起始偏移] ; 将N命令指定的文件内容装入内存指定起始地址处,并将文件长度填充到BX、CX中,BX为长度高16位,CX为低16位,装入文件也可由DEBUG命令时带入参数,如:>DEBUG 文件名。
-L[段地址:]起始偏移 盘号 起始扇区号 扇区数 ; 将指定盘(0号对应A盘、1号对应B盘,依次类推)的指定扇区的内容(一个扇区512字节)装入内存。如:
-L 100 2 0 1 ; 将硬盘C的引导扇区内容读入内存100H开始处
-D 100 ; 显示引导扇区内容
0BB4:0100 3B 52 45 53 45 54 2E 41-53 4D 20 28 52 45 53 45 ;RESET.ASM (RESE
0BB4:0110 54 BF AA B9 D8 B8 B4 CE-BB C6 F4 B6 AF B3 CC D0 T...............
0BB4:0120 F2 29 20 0D 0A 43 4F 44-45 31 20 53 45 47 4D 45 .) ..CODE1 SEGME
0BB4:0130 4E 54 20 41 54 20 30 46-46 46 46 48 20 0D 0A 41 NT AT 0FFFFH ..A
0BB4:0140 53 53 55 4D 45 20 43 53-3A 43 4F 44 45 31 20 0D SSUME CS:CODE1 .
0BB4:0150 0A 41 44 44 52 20 4C 41-42 45 4C 20 46 41 52 20 .ADDR LABEL FAR
0BB4:0160 0D 0A 43 4F 44 45 31 20-45 4E 44 53 20 0D 0A 43 ..CODE1 ENDS ..C
0BB4:0170 4F 44 45 20 53 45 47 4D-45 4E 54 20 0D 0A 4F 52 ODE SEGMENT ..OR
-D
0BB4:0180 47 20 31 30 30 48 20 0D-0A 41 53 53 55 4D 45 20 G 100H ..ASSUME
0BB4:0190 43 53 3A 43 4F 44 45 2C-44 53 3A 43 4F 44 45 2C CS:CODE,DS:CODE,
0BB4:01A0 45 53 3A 43 4F 44 45 0D-0A 53 54 41 52 54 3A 20 ES:CODE..START:
0BB4:01B0 0D 0A 4A 4D 50 20 46 41-52 20 50 54 52 20 41 44 ..JMP FAR PTR AD
0BB4:01C0 44 52 20 0D 0A 43 4F 44-45 20 45 4E 44 53 20 0D DR ..CODE ENDS .
0BB4:01D0 0A 45 4E 44 20 53 54 41-52 54 20 0D 0A 0D 0A 3B .END START ....;
0BB4:01E0 42 4F 4F 54 2E 41 53 4D-20 28 C8 C8 C6 F4 B6 AF BOOT.ASM (......
0BB4:01F0 B3 CC D0 F2 29 20 0D 0A-43 4F 44 45 31 20 53 45 ....) ..CODE1 SE
-D
0BB4:0200 47 4D 45 4E 54 20 41 54-20 30 46 46 46 46 48 20 GMENT AT 0FFFFH
0BB4:0210 0D 0A 41 53 53 55 4D 45-20 43 53 3A 43 4F 44 45 ..ASSUME CS:CODE
0BB4:0220 31 20 0D 0A 41 44 44 52-20 4C 41 42 45 4C 20 46 1 ..ADDR LABEL F
0BB4:0230 41 52 20 0D 0A 43 4F 44-45 31 20 45 4E 44 53 20 AR ..CODE1 ENDS
0BB4:0240 0D 0A 43 4F 44 45 20 53-45 47 4D 45 4E 54 20 0D ..CODE SEGMENT .
0BB4:0250 0A 4F 52 47 20 31 30 30-48 20 0D 0A 41 53 53 55 .ORG 100H ..ASSU
0BB4:0260 4D 45 20 43 53 3A 43 4F-44 45 2C 44 53 3A 43 4F ME CS:CODE,DS:CO
0BB4:0270 44 45 2C 45 53 3A 43 4F-44 45 0D 0A 53 54 41 52 DE,ES:CODE..STAR
-D
0BB4:0280 54 3A 20 0D 0A 4D 4F 56-20 41 58 2C 30 30 34 30 T: ..MOV AX,0040
0BB4:0290 48 20 0D 0A 4D 4F 56 20-44 53 2C 41 58 20 0D 0A H ..MOV DS,AX ..
0BB4:02A0 4D 4F 56 20 41 58 2C 31-32 33 34 48 20 0D 0A 4D MOV AX,1234H ..M
0BB4:02B0 4F 56 20 53 49 2C 30 30-37 32 48 20 0D 0A 4D 4F OV SI,0072H ..MO
0BB4:02C0 56 20 5B 53 49 5D 2C 41-58 20 0D 0A 4A 4D 50 20 V [SI],AX ..JMP
0BB4:02D0 46 41 52 20 50 54 52 20-41 44 44 52 20 0D 0A 43 FAR PTR ADDR ..C
0BB4:02E0 4F 44 45 20 45 4E 44 53-20 0D 0A 45 4E 44 20 53 ODE ENDS ..END S
0BB4:02F0 54 41 52 54 0D 0A 0D 0A-2E 8B 36 E3 91 E9 CE F7 TART......6.....
16、将内存中内容存入磁盘扇区或文件中去的命令W,W命令的格式为:
-W[[段地址:]起始偏移] ; 将内存指定起始地址处的内容(长度由BX、CX指定,BX为长度高16位,CX为长度低16位)存入由N命令指定的文件或DEBUG命令时装入的文件中去。如:
C:\DOCUME~1\ADMINI~1>DEBUG E:\BOOT.DAT
-R BX
BX 0000 ; 指定文件长度高16位为0
:0
-R CX ; 指定文件长度低16位为512(200H)
CX 0000
:200
-W 100 ; 文件存盘
Writing 00200 bytes
-W[段地址:]起始偏移 盘号 起始扇区号 扇区数 ; 将指定内存起始处的内容存入指定盘的指定扇区中。如果遇到C盘引导区被破坏,此时可用软盘启动后,装入刚才备份的引导区文件覆盖到原引导区即可:
C:\DOCUME~1\ADMINI~1>DEBUG E:\BOOT.DAT
-L 100
-W 100 2 0 1 ; 将硬盘C的引导扇区内容读入内存100H开始处
注:32位以上机型不支持此功能
17、十六进制计算H命令格式为: -H 十六进制数1 十六进制数2,如:
-H 1234 5678
68AC BBBC ; 求出两数之和、之差
18、端口输入命令I的格式为: -I 端口地址,从指定端口输入一个字节内容,如:
-I 40
B2
19、端口输出命令O的格式为: -O 端口地址 输出字节内容,将字节内容输出到端口,如破解CMOS口令:
-O 70 10
20、退出命令: -Q