debug 是一个非常古老但功能强大的底层调试工具,主要用于:

- 汇编语言编程:直接编写、汇编和链接机器码程序。
- 内存检查和修改:直接读写和修改内存中的任何位置。
- 磁盘扇区操作:直接读取、写入、甚至格式化磁盘的物理扇区。
- 程序调试:单步执行程序,设置断点,检查寄存器和标志位状态。
重要提示:debug 命令是一个过时的工具,在现代 Windows 系统(如 Windows 10, 11)中,它可能没有被默认安装,或者其功能受到严格限制(尤其是在 64 位系统上),对于现代软件开发,强烈推荐使用专业的集成开发环境 和更现代的调试器,如 Visual Studio Debugger 或 WinDbg。
如何启动 Debug
-
打开命令提示符 (CMD)
- 按
Win + R键,输入cmd,然后按回车。
- 按
-
启动 Debug
- 直接在 CMD 中输入
debug并回车。debug
- 如果系统提示
'debug' 不是内部或外部命令,也不是可运行的程序或批处理文件,说明你的系统没有安装它,你可以尝试从 Windows 安装介质或网络上寻找debug.com文件,并将其放到系统路径(如C:\Windows\System32)下。
- 直接在 CMD 中输入
-
进入 Debug 环境
(图片来源网络,侵删)- 成功启动后,你会看到一个短横线 作为提示符,这表示你已进入
debug的交互模式。
- 成功启动后,你会看到一个短横线 作为提示符,这表示你已进入
Debug 的核心组成部分
debug 主要由两部分组成:命令 和 寄存器。
寄存器
debug 会直接显示和操作 CPU 的寄存器,在 提示符下输入 r 并回车,即可查看所有寄存器的当前值。
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13A0 ES=13A0 SS=13A0 CS=13A0 IP=0100 NV UP EI PL NZ NA PO NC
13A0:0100 C7C6050000 MOV WORD PTR [BX+SI+05],0000 ; 这是 CS:IP 指向的指令
- 通用寄存器:
AX,BX,CX,DX,SP,BP,SI,DI - 段寄存器:
CS(代码段),DS(数据段),SS(堆栈段),ES(附加段) - 指令指针:
IP(指向下一条要执行的指令) - 标志位:
NV UP EI PL NZ NA PO NC(代表各种状态标志)
命令
debug 的命令通常是一个字母,后面可以跟参数,所有命令都用回车键执行。
常用 Debug 命令详解
以下是一些最常用和最重要的 debug 命令。

内存和寄存器操作
| 命令 | 格式 | 描述 | 示例 |
|---|---|---|---|
| R | r [register] |
显示或修改寄存器。 | r ax (修改 AX 寄存器) |
| D | d [address] |
Dump,显示内存内容(十六进制和 ASCII)。 | d 100 (从地址 100 开始显示) |
| E | e address [list] |
Enter,修改内存内容。 | e 100 41 42 43 (将 41, 42, 43 写入地址 100, 101, 102) |
| F | f range list |
Fill,用指定值填充一块内存区域。 | f 100 10f ff (将地址 100 到 10f 填充为 FF) |
| A | a [address] |
Assemble,进入汇编模式,输入汇编指令,自动生成机器码。 | a 100 (在地址 100 处开始汇编) |
| U | u [address] |
Unassemble,将机器码反汇编为汇编语言。 | u 100 (从地址 100 开始反汇编) |
程序执行与调试
| 命令 | 格式 | 描述 |
|---|---|---|
| G | g [=address] [addresses...] |
Go,从当前地址开始执行程序,直到结束或遇到断点。 |
| T | t [=address] [n] |
Trace,单步执行一条指令。n 可指定执行的指令数。 |
| P | p [=address] [n] |
Proceed,单步执行,但会完整执行子程序或循环指令,而不是进入其内部。 |
| N | n filename |
Name,为待加载的程序指定文件名,用于后续的 L 或 W 命令。 |
| L | l [address] [drive] [sector] [n] |
Load,从磁盘加载一个文件到内存。 |
| W | w [address] [drive] [sector] [n] |
Write,将内存中的内容写入磁盘文件。⚠️ 警告:会破坏数据! |
实战示例:编写并运行一个简单的汇编程序
假设我们要在屏幕上打印 "Hello!" 并退出。
步骤 1: 进入 Debug
debug
步骤 2: 使用 A 命令编写汇编代码
输入 a 100 开始在地址 CS:0100 处汇编。
-a 100
13A0:0100 mov ah,09 ; DOS 功能号 09 (显示字符串)
13A0:0102 mov dx,109 ; 字符串的地址
13A0:0105 int 21h ; 调用 DOS 中断
13A0:0107 mov ah,4Ch ; DOS 功能号 4Ch (程序结束)
13A0:0109 int 21h ; 调用 DOS 中断
13A0:010B
按回车键返回 提示符。
步骤 3: 使用 E 命令写入字符串
我们需要在数据段(DS)中定义要打印的字符串,字符串必须以 我们先查看 DS 的值,然后使用 e 命令。
-r ds
DS 13A0
-e ds:109 "Hello!$" ; 在 DS:0109 地址写入 "Hello!$",$ 是字符串结束符
注意:
DS的值可能和你的不一样,使用你自己的DS值。
步骤 4: 查看代码和内存
使用 u 命令确认代码正确,用 d 命令确认字符串已写入。
-u 100 10b
13A0:0100 B409 MOV AH,09
13A0:0102 BA0901 MOV DX,0109
13A0:0105 CD21 INT 21
13A0:0107 B44C MOV AH,4C
13A0:0109 CD21 INT 21
-d ds:109
13A0:0109 48 65 6C 6C 6F 21 24-4C 6F 61 64 20 4D 6F 64 75 Hello!Load Modu
看起来一切正常。
步骤 5: 使用 G 命令运行程序
g=100
程序执行后,你应该能在命令行窗口看到 "Hello!" 的输出。
步骤 6: 退出 Debug
-q
重要警告与总结
- 危险性:
debug是一个无保护的工具。W命令可以直接写入磁盘的任何扇区,这可能会永久破坏你的硬盘数据或操作系统文件,请务必谨慎使用,尤其是在进行写入操作时。 - 时代背景:
debug是为 DOS 和早期 Windows 16 位环境设计的,在 32/64 位的现代 Windows 中,它无法直接访问物理内存或硬件,其功能被大大削弱。 - 学习价值:尽管已过时,但学习
debug对于理解计算机底层工作原理(如 CPU、内存、中断、汇编语言)仍然有巨大的帮助。
如果你需要进行现代 Windows 程序的调试,请务必使用专业的工具,如 Visual Studio 或 WinDbg。
