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