关于Debug的学习扫盲
Debug是什么?
豪华绚丽的Windows让人们把DOS抛到遥远的记忆角落。然而,真正有价值的东西不会轻易退出历史的舞台,Debug就是这样的经典作品之一。从古老的DOS到现今的Windows XP,Debug一直紧紧跟随着微软的操作系统,静静躺在系统文件夹里。也许你平时对它不闻不问,但要想成为人人羡慕的系统高手,我们就得唤醒这个沉睡已久的命令行工具了,通过阅读本文对它的研究,相信你会同笔者一样的感觉到:姜,还是老的辣!
A、寻根溯源:世界第一只计算机BUG和Debug
霍德华·艾肯在哈佛大学攻读物理学博士学位时,开始梦想制作一台计算机帮他解决数学难题,工作后,他找到IBM公司为其投资100万美元研制计算机,第一台成品艾肯把它取名为:马克Ⅰ号,又叫“自动序列受控计算机”,从这时起IBM公司由生产制表机、肉铺磅秤、咖啡碾磨机等乱七八糟玩意的行业,正式跨进了计算机“领地”。
1945年9月9日,为马克II号编制计算程序的女数学家格雷斯·霍波在调试程序时出现了故障,拆开继电器后,发现有只飞蛾被夹扁在触点中间,从而“卡”住了机器的运行。于是霍波把这只飞蛾粘在了计算机的工作日志中,并恢谐地把程序故障统称为“臭虫”(bug),自此以后,只要这台计算机一停止运转(那时候是经常的事),同事们就会开玩笑地对霍德华·艾肯说,我们正在“Debug”(除虫)呢!后来“bug”成为计算机领域的专业行话,如DOS系统中的调试程序,程序名称就叫Debug。
目前那只飞蛾还保存在美国史密森尼博物院的美国历史国家博物馆中呢。
1981年,第一个PC DOS(即DOS 1.00)面世时就已经带上了Debug.com。不过,到目前为止,Debug一直没有大的变动——当然,这是指Debug提供给用户的功能,Debug本身代码、内部运行机制必然随着操作系统的变化而不断改变。然而,无论是Windows 98、2000还是XP,Debug的操作方式与纯DOS环境下基本一样。
B、初学乍练:短短几行命令学用Debug
Debug.exe文件位于Windows\\system32目录(Windows XP)或Windows\\command目录(Windows 9x)下。基本使用方法如下:
Step 1:点击“开始→运行”,输入“CMD”(Windows 2000/XP)或“Command”(Windows 9x)打开命令提示符窗口。
Step 2:输入“Debug”并回车,出现提示符“-”,现在你已经开启了神秘的Debug世界了。 小提示
执行“?”命令可以参看Debug主要命令及参数。
Step 3:输入“D FE00:0”,回车后可以看到结果(见图1),这个就是主板BIOS的厂商信息。接着再输入“D FFFF:5 L 8”,回车后,主板的BIOS版本日期也出来了。
Step 4:现在再输入“Q”命令,回车后就退出了Debug程序。
C、继续深入:Debug经典实例秀
在操作以下实例之前,提醒您要注意操作安全,因为Debug命令有一定风险,如果输入错误,有可能对系统造成一定破坏,这点请您一定注意。 实例1:查看你的显卡信息
输入“D C000:0090”命令并回车,这时右侧部分可以看到系统中显卡的显存、生产厂商等信息。 实例2:制作BIOS密码破解器
忘记BIOS密码,一般都采用放电法来清空密码,但这对普通用户有一定难度,并且还得开机箱。其实利用Debug的0命令则简单得多!请在“-”后输入以下命令:
o 70 19 o 71 15 q
重启电脑,系统提示CMOS校验和出错,并要求重新进入BIOS设置CMOS。
小提示:70和71是CMOS的两个端口,我们可以在它们的后面随意写入一些错误数据(如19、16、17等),就会清空CMOS里所有设置,如果不见效不妨多用几个数据试试。
如果觉得每次输入Debug命令太麻烦,可以用下面的方法把命令存成一个COM文件,需要解除密码时只要运行一下就行了。请在Debug中命令提示符“-”后输入以下命令: A 100 MOV DX,70 MOV AL,10 OUT DX,AL MOV DX,71 MOV AL,01
OUT DX,AL(这里要两次回车,接着会出现“-”提示符,然后再输入下面的命令) R CX(回车后会出现“CX 0000”,然后再次按回车) 0C N pass.COM W Q
这样就会在Debug当前目录下生成pass.com,是一个清除BIOS口令设置的程序,只要在DOS提示符下键入“pass”,然后按回车即可。经我们测试,其实在Windows下面运行也可以成功,只是不太稳定,有时会重新启动计算机。
二、DEBUG的主要用途及DEBUG的调用
DEBUG是为汇编语言设计的一种调试工具,它通过单步执行、设置断点等方式为汇编语言程序员提供了非常有效的程序调试手段。DEBUG可以直接用来检查和修改内存单元、装入、存储及启动运行程序、检查及修改寄存器,也就是说DEBUG可深入到计算机的内部,可使用户更紧密地与计算机中真正进行的工作相联系。不仅如此,对汇编语言初学者来说,DEBUG也是练习使用汇编指令的一种有效工具。初学者可以直接在DEBUG环境下执行汇编指令。然而,在DEBUG下运行汇编语言源程序也受到了一些限制,它不宜汇编较长的程序,不便于分块程序设计,不便于形成以DOS外部命令形式构成的 .EXE文件,不能使用浮动地址,也不能使用ASM和MASM提供的绝大多数伪指令。
在DOS系统中,DEBUG是以DOS外部命令文件形式提供给用户的,名为DEBUG.EXE。命令文件DEBUG.EXE一般存放在DOS子目录下,因此调用DEBUG时,只需在DOS提示符下键入:
DEBUG [<驱动器名>:][<路径>][<文件名>[.<扩展名>]][<参数1>][<参数2>] < 回车> 例如: C:\\DOS>DEBUG DISKCOPY.COM A: B:
进入DEBUG的提示符是符号“-”。即,出现提示符“-”就表示可以接受DEBUG命令了。 当进入DEBUG时,寄存器和标志设成以下数值,这些值用于DEBUG调试中的程序。 段寄存器CS,DS,ES和SS均指向DEBUG末尾的第一个段。
IP寄存器置为0100H。栈指针SP指向尾部或装入程序的暂存部分的底部。
其余寄存器皆取零值,但若用户调用时含文件说明,则CX含文件长度(长度大于64K时BX含长度的高位);标志为各自的复位值;驱动器传送地址在代码段位移80H处。
注意,若DEBUG装入扩展名为.EXE的文件,则DEBUG需重定位且设置段寄存器指示器为文件中所定义的值。但DS,ES指向最低可用段处的程序区前缀。BX和CX为文件容量值。而 .EXE文件如果在连接时选择了装入内存高处的参数,则该程序装入高处。
三、DEBUG的主要命令功能与格式
DEBUG命令是在DEBUG提示符“-”下,由键盘键入的。每条命令以单个字母的命令符开头,然后是命令的操作参数,操作参数与操作参数之间,用空格或逗号隔开,操作参数与命令符之间用空格隔开,命令的结束符是回车键 Enter。命令及参数的输入可以是大小写的结合。Ctrl+Break键可中止命令的执行。Ctrl+Num Lock键可暂停屏幕卷动,按任一键继续。所用数均为十六进制数,且不必写H。 * 1. 汇编命令A
格式:A [[<段寄存器名>/<段地址>:] <段内偏移>] 上式等价于:
(1) A <段寄存器名>:<段内偏移> (2) A <段地址>:<段内偏移> (3) A <段内偏移> (4) A
功能:键入该命令后显示段地址和段内偏移并等待用户从键盘逐条键入汇编命令,逐条汇编成代码指令,顺序存放到段地址和段内偏移所指定的内存区域,直到显示下一地址时用户直接键入回车键返回到提示符“-”。
注: 其中(1)用指定段寄存器的内容作段地址,(3)用CS的内容作段地址,(4)以CS:100作地址。以后命令中提及的各种‘地址’形式,均指(1)、(2)、(3)中A后的地址形式。 2. 比较命令C
格式: C <源地址范围>,<目标地址>
其中<范围>是由<起始地址> <终止地址>或者是由<起始地址> L <长度>指出的一片连续单元。
功能:从<源地址范围>的起始地址单元起逐个与目标起始地址以后的单元顺序比较单元的内容,直至源终止地址为止。遇有不一致时,以<源地址> <源内容> <目标内容> <目标地址>的形式显示失配单元及内容。 * 3. 显示内存命令D 格式: D [<地址>/<范围>] 上式等价于: (1) D <地址> (2) D <范围> (3) D
功能:以两种形式显示指定范围的内存内容。一种形式为十六进制内容,一种形式为以相应字节的内容作为ASCII码的字符,对不可见字符以‘.’代替。 注: 其中(1)以
CS
为段寄存器。(3)显示
CS:100
起始的一段内
容 * 4. 修改内存命令E
格式: E <地址> [<单元内容表>] 上式等价于: (1) E <地址>
(2) E <地址> <单元内容表>
其中<单元内容表>是以逗号分隔的十六进制数,或用’或”括起来的字符串,或者是二者的组合。
功能: (1)不断显示地址,可连续键入修改内容,直至新地址出现后键入回车Enter为止。(2)将<单元内容表>逐一写入由<地址>开始的一片单元。 5. 填充内存命令F
格式: F <范围> <单元内容表>
功能: 将单元内容表中的值逐个填入指定范围,单元内容表中内容用完后重复使用。 例如: -F 5BC:200 L 10 B2,‘XYZ’,3C
* 6. 执行命令G
格式: G [=<地址>[,<断点>]] 上式等价于: (1) G (2) G=<地址> (3) G=<地址>,<断点> 功能: 执行内存中的指令序列 注: (1)从CS:IP所指处开始执行 (2)从指定地址开始执行
(3)从指定地址开始执行,到断点自动停止。 7. 十六进制算求运算指令H 格式: H <值1> <值2>
功能: 求十六进制数<值1>和<值2>的和与差并显示结果。 8. 端口输入命令I 格式: I <端口地址>
功能: 从指定端口接收信息并将输入的内容显示出来。 * 9. 读盘命令L
格式: L <地址> <驱动器号> <起始逻辑扇区> <所读扇区个数n>
其中<地址>的缺省值为CS:100。逻辑扇区可由物理扇区号换算得到,以双面双密度盘为例:物理扇区是按0面0道1区,0面0道2区,??,0面0道9区,0面1道1区,??,0面39道9区,1面0道1区,??,1面39道9区排列。而逻辑扇区与物理扇区号的对应关系为物理扇区0面0道1扇区至9扇区,逻辑扇区号为0—8;物理扇区1面0道1扇区至9扇区,逻辑扇区号为9—11H;物理扇区0面1道1扇区至9扇区,逻辑扇区号为12—1AH;??。这样每道先0面后1面一直排下去。
其中<驱动器号>为0、1或2,0表示A驱,1表示B驱,2表示硬盘。
功能: 将<驱动器号>指定的盘上,从<起始逻辑扇区>起,共n个逻辑扇区上的所有字节顺序读入指定内存地址开始的一片连续单元。当L后的参数缺省时,必须在L之前由N命令指定(或进入DEBUG时一并指出)所读驱动器文件名。此时L执行后将该文件装入内存。 例如:-N EXAMPLE
将当前驱动器上的EXAMPLE文件装入CS:100起始的一片内存单元。 10. 内存搬家命令M
格式: M <源地址范围> <目标起始地址>
其中源及目标地址若仅输入偏移量,则隐含相对DS。
功能:把<源地址范围>中的内容顺序搬至<目标起始地址>起的一片连续单元。 例如:-M CS:100 110 600
把从CS:100起至CS:110止17个字节搬至DS:600至DS:610的一片单元。 * 11. 命名待读/写文件命令N 格式: N <文件名说明>
功能: 为L/W命令指定待装入/写盘文件 注: 其它形式参考DOS手册 12. 端口输出命令O 格式: O <端口地址> <字节>
功能:将该<字节>从指定<端口地址>输出。 例如:-O 2F 4F
将4FH从端口2FH输出
* 13. 结束DEBUG返回DOS命令Q 格式:Q
功能:返回DOS提示符下 * 14. 显示修改寄存器命令R 格式: R [<寄存器名>] 上式等价于: (1) R
(2) R <寄存器名>
功能: (1)显示当前所有寄存器内容,状态标志及将要执行的下一指令的地址,代码及汇编语句形式。其中对状态标志FLAG以每位的形式显示,详见下表。 状态标志显示形式示意图
标志位 溢出OF 方向DF 中断IF 符号SF 零 ZF 辅助AF 奇偶PF 进位CF
状 态 有/无 减/增 开/关 负/正 零/非 有/无 偶/奇 有/无
显 示 OV/NV DN/UP EI/DI NG/PL ZR/NZ AC/NA PE/PO CY/NC (2)显示指定寄存器内容 例如:-R AX
功能:在指定范围搜索表中内容,找到后显示表中元素所在地址 例如:-S CS:100 110 41
表示在位移100H至110H间的上述两处有41H。又如: -S C3:100 L 11 41“AB”E
表示在当前代码段位移100H至111H处寻找连续4个字节内容为41H、41H、42H、0EH的起始单元地址。 * 16. 执行并显示系统环境命令T 格式:T [=<地址>] [<条数>]
功能:执行由指定地址起始的、由<条数>指定的若干条命令。其中<地址>的缺省值是当前IP值,<条数>的缺省值是一条。
例如:-T
格式:U [<地址>/<地址范围>] 上式等价于: (1) U <地址> (2) U <地址范围> (3) U
功能:将指定范围内的代码以汇编语句形式显示,同时显示地址及代码。注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果。地址及范围的缺省值是上次U指令后下一地址的值。这样可以连续反汇编。