中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
English/Chinese Fix Translation
作者:
标题: Debug命令详解 上一主题 | 下一主题
ko20010214
版主




积分 7296
发帖 1628
注册 2002-10-16
状态 离线
『楼 主』:  Debug命令详解 [已使用 LLM 解释]

发信人: liuxf (飞天御剑流), 信区: DOS
标 题: Debug命令详解
发信站: BBS 水木清华站 (Mon Apr 23 16:16:59 2001)

Debug命令详解

精华区没有,就贴上来了。

命令行参数形式:
格式:DEBUG 文件名 ]
用途:debug将所指定文件装入内存,显示提示符“-”等待进一
步命令。若装入文件为.exe文件,按照重定位原则装入为可执行状态
。.com文件类似。若为其它类型文件则直接进行内存映射,由偏移量
100H原封不动读入内存。
debug将在缓冲区为被调试程序建立适当的PSP(程序段前缀,
Program Segment Prefix)。在PSP中的偏移量80H为命令行的末尾。
而且在偏移量5CH和6CH由包含参数后面的可选参数构成缺省的FCB(
文件控制块,File Control Block)。
进入时各寄存器初使情况:
寄存器 .com程序 .exe程序
AX 指定驱动器错误码 指定驱动器错误码
BX 程序空间的高地址 程序空间的高地址
CX 程序空间的低地址 程序空间的低地址
DX 0 0
SI 0 0
DI 0 0
BP 0 0
SP 0FFFFH或可利用的 不定
内存空间上限减2
IP 100H 目标程序的的代码
入口偏移量
CS PSP 目标程序代码段址
DS PSP PSP
CS PSP PSP
SS PSP 目标程序堆栈段底

命令:
A: 编写汇编代码(Assemble)
格式:A
用途:程序允许在指定位置(若无缺省为IP指针位置)进行汇编
程序书写。
细节:
*所有数值皆为十六进制整数,数值后不带“H”
*不支持文件管理用的目录表、宏标记、条件汇编
*跳转指令后要直接书写十六进制地址不支持标号
*数据类型若非默认类型,要以PTR加以指定
*字符串操作要指定类型为B或W(如lodsb和lodsw等)及长度
*用DB和DW接受数据定义,直按进行汇编
*对内存地址加以与立即数区分

C: 内存内容比较(Compare)
格式:C 地址范围 地址
地址范围:做比较的第一个内存域始未地址或始地址和长度
地址: 做比较的第二个内存域的始地址
用途:*对内存中两个域的内容加以比较,以字节为单位。对发现有
差别的内容及其地址用如下形式显示出:
地址1 始位置 未位置 地址2
*若地址范围或地址不含段地址,默认为DS的值。

D: 显示内存内容(Dump)
格式:D
地址范围:给定显示区的始未范围或始地址和长度。
用途:*内存内容显示指令,以十六进制和ASCII码形式显示指定范
围内的内存内容。
*若不指定范围,第一次按目标程序的CS:IP的位址开始显示。
以后使用上次显示的未地址的下一地址为开始进行显示。
*若不指定长度,则显示128byte的内容。计8行。

E: 数据的输入
格式:E 地址 数值列表
地址: 数据输入的内存始地址
数值列表:从始地址输入的连续数据
用途:*向内存区域输入数据。数据以十六进制形式,或以ASCII码形式
均可。覆盖掉原有数据。
*十六进制时要用空格、逗号或制表符加以分隔。字符串则要用单
引号或双引号括起且区分大小写。
*若不指写段址,则默认为DS中值。每写完一数据地址自动增加。
*如省略数值列表,对应每一字节请求输入。点号前为该字节原
始值,点号后请求输入。这时若按空格,跳过这一字节;按回车,
结束输入;按减号或连字符,显示前一字节内容。
     *出错时内存内容有可能已被改变。提示后终止。
*字符串只能以数值列表的形式输入,不能按地址提式输入。

F: 内存填充(Fill)
格式:F 地址范围 数值列表
    地址范围:数据输入的内存始本地址或首地址和长度
数值列表:从始地址输入的连续数据
  用途:*将列表中数据写入内存。输入数据以十六进制或ASCII码形式。
     覆盖原有信息;若出错,显示出错信息,原有信息保留。
     *若未指写段址,默认为DS寄存器值。
     *列表中可有十六进制或字符串两种形式,各内容用空格、逗号、
     制表符隔开。字符串必须以单引号或双引号括起,区分大小写。
     *若要填充区域大于数据数目,列表可重复使用;相反,若列表
     比要填充区域大时,则自动截断后面的数据。

G: 程序执行(Go)
格式:G
地址: Debug开始执行的地址。
断点0……断点9:指定的0—10个临时中断点。
用途:*将CPU控制权由Debug转移给被调试中的程序。不设断点时,则程
序的执行或是中途失败或是正常结束。结束时,提示有“Program
termminated nomally”,即程序结束正常,控制权再返回到
Debug。
*此时因数据有可能重写,若需再次执行,因重新装入。
*地址中,如未指定段址,则使用目标程序的CS寄存器中的值。当
地址省略时,则Debug使用目标程序的CS:IP寄存器的值开始执行。
且为与断点区分,地址参数前必须加等号,否则将其认为是第零
个断点。
*断点参数可指定10个临时断点。当程序执行到指定的断点地址时
则发生中止。与断点表内的次序无关,断点可按任意次序输入。
*中止时,将会显示寄存器的内容、标志位状态及CS:IP指出的指
令(也就是下一条将要执行的指令),然后是提示符“-”。
*若没有装入可执行程序或程序内容未知,有可能进入死状态。
*若目标程序的栈不起作用或太小,则可能引起系统“破碎”。

H: 执行十六进制算术运算(Hexadecimal)
格式:H 值1 值2
值1、2为0—FFFFH范围内的任意十六进制数。
用途:*用来求两个十六进制数的和、差,对结果显示为值1+值2及值1-
值2。如果值2 > 值1则显示其补码。
*虽然很少用,但事实还是很有用的,熟练掌握。

I: 端口的输入(Input)
格式:I 端口地址
端口地址:0—FFFF范围内的I/O端口地址。
用途:用来读取指定I/O端口地址,并以2位十六进制数加以显示。
警告:I指令将直接访问计算机硬件,不是所以错误检查都能进行,所以
使用是必须小心。对某个外设控制器分配端口的输入操作,可能
干涉系统固有的操作。对没有分配指定I/O端口的设备,或该端口
为写入专用端口等情况,I命令都不能保证可显示。

L: 装入命令(Load)
格式:L 地址

L 地址 驱动器 开始扇区 扇区数
地址: 存放从盘中读出数据的内存地址。
驱动器: A=0, B=1, C=2, 以此类推。
开始扇区:以十六进制数表示要最先装入的逻辑扇区号。
扇区数: 以十六进制数表示要装入连续扇区个数。
用途:*若输入了一个不完全的L命令时,则对下述磁盘文件进行装入:
1在Debug命令行中指定过的文件;
2由命令末尾参数N指定的文件。
*在地址中若未指定段址,则使用CS中的值。若为可执行文件按重
定位原则装入为可执行状态。
*装入后文件长度,或.exe文件程序的实际长度放入目标程序的BX
和CX两个寄存器中。高十六位放在BX中。
*若在命令行中给出所有参数,则不必用MS-DOS的文件系统访问磁
盘。

M: 数据传送(Move)
格式:M 地址范围 地址
地址范围:被复制域的始末地址,或始地址和长度。
地址: 数据复制目的域的起始地址。
用途:*对内存中数据进行复制。目的域被覆盖。
*若地址范围中无段址,则使用DS内容;若地址中无段址,使用地
址范围中的值。


N: 文件名或命令末尾的参数(Name)
格式:N 参数
参数:插入到仿真的PSP中去一个以上的文件名或者是开关项。
用途:*对磁盘读写操作L、W指定目标文件。


O: 端口的输出(Output)
格式:O 端口 字节
端口:I/O端口地址。
字节:写入I/O端口的0—FFFF范围的值。
用途:向I/O端口地址写入一字节。
警告:错误的操作将导致系统崩溃。

P: 循环或子程序处理(Procedure)
格式:P
地址: 执行的起始地址。
指令数:执行的指令条数。
用途:*循环或子程序处理。将循环、串指令、软件中断或子程序调用
视为单语句。执行中了,显示目标程序寄存器内容、标志位状态
和下一条要执行的指令。
*若地址参数中无段址,则使用CS中的值。完全忽略地址时,则从
程序中的CS:IP指定位置开始执行。

Q: 结束Debug操作(Quit)
格式:Q
用途:程序结束返回。对未保存的结果丢失。

R: 寄存器显示与更改(Register)
格式:R
寄存器:AX BX CX DX SP BP SI DI
DS ES CS IP PC
F
用途:*若R不带参数,则显示所有寄存器的内容和状态标志、下一指令。
*若指定新值,在显示内容后,给出冒句提示输入新值。回车结束。
*对状态字F,在连字符“-”后以空格间隔输入新值,次序不计。
*若直接回车,则跳过修改,寄存器内容不变。

S: 内存检索(Search)
格式:S 地址范围 列表
地址范围:想来你该明白是什么样了吧:)
列表: 欲检索的一个以上的字节值或字符串。
用途:*在指定的内存范围内检索列表的值。对每一个匹配的地址进行
显示。
*若起地址中无段址,默认为DS的值。
*检索范围不得大于FFFFH
*列表必须以分隔符(空格,逗号,制表符等)分隔;字符串要加
单引号或双引号括起,区分大小写。

T: 程序执行跟踪(Trace)
格式:T
地址: 执行的第一条指令的地址。
指定数:执行的机器指令的条数。
用途:*执行单条指令,显示寄存器及下一条指令。
*在地址参数中若无段址,则默认为CS寄存器的值。
*若全部省略,则由CS:IP寄存器指出的地址开始执行。
*以后则顺序执行。
*对ROM内的跟踪应使用T命令。
警告:对Intel 8259 中断屏幕的内容(IBM PC及兼容机端口20H和21H)
的更改,或者系统功能调用(INT 21H),不能使用T指令,对上述
情况要使用P指令。

U: 反汇编(Unassemble)
格式:U
用途:*将机器指定解码为汇编语言的助记符。
*地址范围中无段址时,默认使用CS值。
*当始地址与实际边界不一致时,结果将不可信。
*若不含末地址或长度,则自给定始地址起反汇编32个字节。
*以后由前次U最后一指令的下一指令做32字节的反汇编。
*若从没用过U,则于CS:IP开始进行反汇编。
*只能对8086指令解码,对其它以DB来显示。

W: 写入文件或扇区(Write)
格式:W

W 地址 驱动器 开始扇区 扇区数
地址: 待写入盘的数据在内存中的起始位置。
驱动器:写入数据的盘的驱动器号(A=0,B=1,C=2,以下类推)。
始扇区:写入数据的最前的逻辑扇区号(0—FFFFH)。
扇区数:写入数据的连续扇区个数(0—FFFFH)。
用途:*将内存中的文件或一个个扇区传送到磁盘上。
*W若不带参数,或只有地址参数,则按BX:CX寄存器指出的字节,从内
存向磁盘写入数据。此时的文件名是此命令前最后一个使用过的文件名
,或者是N命令中指定的文件,如果没有使用过N命令,则使用Debug命
令行中指定的文件。
*Debug的W命令,不能向扩展名为.EXE或.HEX的文件中写入数据。
*这可用改扩展名的方法得到应用,让其能对.exe文件写入。
*若无地址项,则认为是目标程序的CS:0100H。
*该命令可不通过MS-DOS的文件系统直接访问磁盘的逻辑扇区。但必须
以十六进制形式给在命令行中给定各参数。
*W命令不能对用于网络上的驱动器进行逻辑扇区写入处理。
警告:若参数有误,则可能破坏盘文件结构。
请务必先搞清再作试践,特别是对硬盘的操作。

--

※ 来源:·BBS 水木清华站 smth.org·

(本文采用S-Term文章拷贝脚本拷贝)
==================================================


   此帖被 +1 点积分    点击查看详情   
评分人:【 vsbat 分数: +1  时间:2010-5-20 16:18
LLM 解释

这是一份关于 DOS 环境下核心调试工具 DEBUG.EXE 的经典技术总结。DEBUG 是 16 位 DOS 时代功能最直接、权限最高的系统级工具之一,它不仅用于程序调试,还广泛应用于汇编开发、系统配置(如设置 CMOS)、磁盘底层修复以及批处理增强。

针对原文内容及后续讨论,现从技术原理、环境限制和工程实践角度进行补充与纠正:

1. 运行环境与寄存器初始化

原文中提到的寄存器初值是理解 DEBUG 工作原理的关键:

  • PSP(程序段前缀):无论加载什么文件,DEBUG 都会在内存中先建立一个 256 字节(100H)的 PSP。
  • COM vs EXE
    • COM 文件:是纯粹的代码映像。DEBUG 将其加载到 CS:100H 处(PSP 之后)。因此,COM 程序的起始 IP 始终为 100H
    • EXE 文件:包含文件头和重定位表。DEBUG 会根据 EXE 头部的定义,自动计算初始的 CS:IPSS:SP。这意味着调试 EXE 时,起始地址不一定是 100H
  • 程序长度:文件加载后,BX:CX 寄存器组合存放文件的字节数(BX 为高 16 位,CX 为低 16 位)。这是使用 W 命令保存文件前必须手动检查或修改的参数。

2. 关键指令的技术细节纠正

  • A (Assemble) 指令DEBUG 的内置汇编器非常基础。它不支持定义变量名(标号),因此所有跳转指令(如 JMP, JZ)必须直接书写目标偏移地址(如 JMP 0110)。此外,它不支持 80286 及更高版本的指令集(如 PUSH 10 这种立即数入栈在 8086 上是非法的,DEBUG 无法汇编)。
  • G (Go) 指令的陷阱: 执行 G 命令时,若不设断点且程序内部没有正常的退出机制(如 INT 21H4CH 功能号),程序会一直运行到内存中不可预知的区域,最终导致系统挂起或死机。
  • T (Trace) 与 P (Proceed) 的本质区别
    • T 指令利用 CPU 的陷阱标志(Trap Flag),每执行一条机器指令就触发一次 INT 1 中断返回 DEBUG
    • P 指令对于 CALLINTLOOP 指令,会在该指令的下一条指令处设置临时断点,然后通过 G 的逻辑运行。这就是为什么在执行 INT 21H 时必须用 P:如果用 T 进入 DOS 中断内部,由于 DOS 是非重入的,且涉及大量复杂的底层操作,极易导致调试器崩溃。

3. 磁盘操作 (L/W) 的合规与安全风险

  • 直接磁盘扇区访问LW 命令允许绕过文件系统直接读写物理扇区(如 L 100 0 0 1 读取 A 盘 0 扇区到内存 100H)。
  • Windows 环境限制:在 Windows 95/98 的 DOS 窗口中,直接写扇区可能需要锁定驱动器。在 Windows NT 架构(2000/XP/Win7 等)的 CMD 虚拟 DOS 机(NTVDM)中,出于安全保护,W 命令通常被禁止直接写入物理硬盘扇区,只能操作软盘映像或通过 NTVDM 模拟的文件。
  • EXE 写入限制:原文提到的“不能向 .EXE 写入”是出于保护重定位信息的考虑。当 DEBUG 加载 EXE 时,它已经处理了重定位,内存中的映像与原始文件不再一致。若要修改 EXE,通常需要先将扩展名改为 .DAT.BIN,按二进制文件加载,修改后再改回。

4. 批处理脚本化(Debug Script)

论坛用户提到的“Debug 和 bat 结合”是指利用 DOS 重定向功能。这在 90 年代常用于通过批处理生成小的 .COM 工具。 例如,创建一个清屏工具 CLS.COM

echo a 100 > cls.scr
echo mov ax,0600 >> cls.scr
echo mov bh,07 >> cls.scr
echo mov cx,0000 >> cls.scr
echo mov dx,184f >> cls.scr
echo int 10 >> cls.scr
echo mov ah,4c >> cls.scr
echo int 21 >> cls.scr
echo. >> cls.scr
echo r cx >> cls.scr
echo 0d >> cls.scr
echo n cls.com >> cls.scr
echo w >> cls.scr
echo q >> cls.scr
debug < cls.scr

这种技术利用了 DEBUG 从标准输入读取命令的特性,是当年实现复杂系统维护任务的常用手段。

5. 关于“玄学”现象的说明

早期用户常反馈 DEBUG 运行时出现显示乱码或死机,通常有以下原因:

  1. 代码覆盖了 PSP:如果汇编代码起始地址小于 100H,会破坏 PSP 中的关键信息(如句柄表),导致 INT 21H 退出失败。
  2. 堆栈溢出:在 DEBUG 环境下,若未显式定义堆栈段,程序使用的是 DEBUG 分配的默认堆栈,容量极小,深度嵌套的 CALL 会导致覆盖程序自身代码。
  3. 80286+ 指令反汇编:使用 U 指令查看包含 386 指令的代码时,DEBUG 会将其错误地识别为多个不相关的 8086 指令或 DB 数据。




ko20010214
=================================
大功告成,打个Kiss!
ko20010214@MSN.com
神州优雅Q300C
Intel CeleronM 370处理器 | 256MbDDR内存
40G硬盘 | USB2.0 | IEEE 1394
13.3 ' WXGA 宽屏(16:10) | COMBO光驱
10/100M网卡 | 四合一读卡器
2003-6-1 00:00
查看资料  发送邮件  发短消息  网志  OICQ (16959102)  编辑帖子  回复  引用回复
我爱dos
初级用户

香蕉术士


积分 317
发帖 52
注册 2003-5-18
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

支持,希望能继续




永远支持永远支持
2003-6-1 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
wangqingfu
初级用户




积分 162
发帖 16
注册 2003-6-3
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

看了半天,可惜的是什么也没看懂!


2003-6-5 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
ttimber
初级用户




积分 198
发帖 43
注册 2004-11-2
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

支持,希望能继续





我爱电脑,更爱软件,最爱的是我的父母和老婆!
2005-6-14 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
本是
银牌会员





积分 2221
发帖 789
注册 2005-1-27
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

  不错!写得很清楚,是专家作的。如果能配上简明和典型的例子,对初学者就更有用了。
  也可以配一些现在仍然有用的功能的脚本段……

  如果自己设计程序,就必须搞懂了。




my major is english----my love is dos----my teacher is the buddha----my friends--how about U
2005-12-20 14:16
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
netrabbit
初级用户





积分 34
发帖 16
注册 2006-10-24
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

学习了 真是不错的作品 有助于大家了解DEBUG


2006-10-25 11:26
查看资料  发短消息  网志   编辑帖子  回复  引用回复
henrya2
中级用户





积分 486
发帖 171
注册 2006-2-12
状态 离线
『第 7 楼』:   使用 LLM 解释/回答一下

不错,比起网上流行的版本好理解的多(网上流行的版本是港台专业术语,真累).




Those who do not study the past are condemned to repeat it
2007-3-12 07:07
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
xycoordinate
中级用户




积分 493
发帖 228
注册 2007-2-16
来自 安徽
状态 离线
『第 8 楼』:   使用 LLM 解释/回答一下

要是有人举几个小例子,就太好了!


2007-3-18 22:22
查看资料  发送邮件  发短消息  网志  OICQ (226308607)  编辑帖子  回复  引用回复
guxingyibei
初级用户





积分 68
发帖 32
注册 2007-4-1
状态 离线
『第 9 楼』:   使用 LLM 解释/回答一下

解释很详细,就是没有列举例子,有好多都摸不找门路


2007-4-20 10:12
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
tuliangwl
初级用户

九州散人


积分 55
发帖 28
注册 2007-9-14
状态 离线
『第 10 楼』:   使用 LLM 解释/回答一下

唉,看了这个才觉得自己真是太渺小了..还有好多东西都不知道,恩,一定要好好学!


2008-3-6 12:25
查看资料  发送邮件  发短消息  网志  OICQ (375565837)  编辑帖子  回复  引用回复
nASI
新手上路





积分 2
发帖 1
注册 2008-5-21
状态 离线
『第 11 楼』:   使用 LLM 解释/回答一下

希望對大家有用

這個有例子, 有解說, 不錯的


2008-5-21 14:33
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
liminghack
初级用户





积分 51
发帖 25
注册 2008-4-27
来自 学校
状态 离线
『第 12 楼』:   使用 LLM 解释/回答一下

不太好懂啊!可不可以给一两个好的例子啊!


2008-6-1 00:39
查看资料  发送邮件  发短消息  网志  OICQ (453187173)  编辑帖子  回复  引用回复
mmh1
初级用户





积分 20
发帖 24
注册 2009-3-18
状态 离线
『第 13 楼』:   使用 LLM 解释/回答一下

真的太好了,才发现debug和bat结合,好用很多啊


2009-4-13 23:49
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
jzwspace
初级用户





积分 34
发帖 17
注册 2009-8-11
状态 离线
『第 14 楼』:   使用 LLM 解释/回答一下

讲得非常精彩,但不适合初学者


2009-8-13 23:03
查看资料  发短消息  网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 15 楼』:   使用 LLM 解释/回答一下

我顶!!!!!!!




综合型编程论坛

我的作品索引
2009-9-1 11:17
查看资料  发送邮件  访问主页  发短消息  网志  OICQ (523066680)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: