在win7环境下debug的使用

背景:豪华绚丽的Windows让人们把DOS抛到遥远的记忆角落。然而,真正有价值的东西不会轻易退出历史的舞台,Debug就是这样的经典作品之一。从古老的DOS到现今的Windows XP,Debug一直紧紧跟随着微软的操作系统,静静躺在系统文件夹里。也许你平时对它不闻不问,但要想成为人人羡慕的系统高手,我们就得唤醒这个沉睡已久的命令行工具了,通过阅读本文对它的研究,相信你会同笔者一样的感觉到:姜,还是老的辣!

一、操作步骤

1.确定源程序的存放目录

建议源程序存放的目录名为ASM(或MASM),并放在C盘或D盘的根目录下。如果没有创建过此目录,请用如下方法创建:

通过Windows的资源管理器找到C盘的根目录,在C盘的根目录窗口中点击右键,在弹出的菜单中选择“新建”→“文件夹”,并把新建的文件夹命名为ASM。

请把编程序MASM.EXE、链接程序LINK.EXE、调试程序DENUG.EXE/TD.EXE都拷贝到此目录中。

如果没有MASM.EXE、LINK.EXE、DENUG.EXE/TD.EXE这些系统软件,那么可以下载,建议下载地址:http://download.csdn.net/download/adengou/3446549

2.建立ASM源程序

建立ASM源程序可以使用EDIT或NOTEPAD(记事本)文本编辑器。下面的例子说明了用EDIT文本编辑器来建立ASM源程序的步骤(假定要建立的源程序名为HELLO.ASM),用NOTEPAD(记事本)建立ASM源程序的步骤与此类似。

在Windows中点击桌面左下角的“开始”按钮→选择“所有程序”→选择“附件”→选择“命令提示符”,在弹出的窗口中输入“EDIT.COM  C:\ASM\HELLO.ASM”,屏幕上出现EDIT的编辑窗口,如图所示。

spacer.gif

spacer.gif

窗口标题行显示了EDIT程序的完整路径名。紧接着标题行下面的是菜单行,窗口最下面一行是提示行。菜单可以用Alt键激活,然后用方向键选择菜单项,也可以直接用Alt-F打开File文件菜单,用Alt-E打开Edit编辑菜单,等等。

如果键入EDIT命令时已带上了源程序文件名(C:\ASM\HELLO.ASM),在编辑窗口上部就会显示该文件名。如果在键入EDIT命令时未给出源程序文件名,则编辑窗口上会显示“UNTITLED1”,表示文件还没有名字,在这种情况下保存源程序文件时,EDIT会提示输入要保存的源程序的文件名。

编辑窗口用于输入源程序。EDIT是一个全屏幕编辑程序,故可以使用方向键把光标定位到编辑窗口中的任何一个位置上。EDIT中的编辑键和功能键符合Windows的标准,这里不再赘述,编辑hello汇编源程序:

spacer.gif

源程序输入完毕后,用Alt-F打开File菜单,用其中的Save功能将文件存盘。如果在键入EDIT命令时未给出源程序文件名,则这时会弹出一个“Save as”窗口,在这个窗口中输入你想要保存的源程序的路径和文件名(本例中为C:\ASM\HELLO.ASM)。

注意:汇编语言源程序文件的扩展名最好起名为.ASM,这样能给后面的汇编和连接操作带来很大的方便。

3.用MASM.EXE汇编源程序产生OBJ目标文件

源文件HELLO.ASM建立后,要使用汇编程序对源程序文件汇编,汇编后产生二进制的目标文件(.OBJ文件)。具体操作如下:

方法一:在Windows中操作

用资源管理器打开源程序目录C:\ASM,把HELLO.ASM拖到MASM.EXE程序图标上。

方法二:在DOS命令提示符窗口中操作

选择“开始”→“所有程序”→“附件”→“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入MASM命令:

I:>C:<回车>

C:>CD \ASM<回车>

C:\ASM>MASM HELLO.ASM<回车>

操作时的屏幕显示如图2所示。

spacer.gif

不管用以上二个方法中的哪个方法,进入MASM程序后,都会提示让你输入目标文件名(Object filename),并在方括号中显示默认的目标文件名,建议输入目标文件的完整路径名,如:C:\ASM\HELLO.OBJ〈回车〉。后面的两个提示为可选项,直接按回车。注意,若打开MASM程序时未给出源程序名,则MASM程序会首先提示让你输入源程序文件名(Source filename),此时输入源程序文件名HELLO.ASM并回车,然后进行的操作与上面完全相同。

如果没有错误,MASM就会在当前目录下建立一个HELLO.OBJ文件(名字与源文件名相同,只是扩展名不同)。如果源文件有错误,MASM会指出错误的行号和错误的原因。上图就是是在汇编过程中检查出一个错误的例子。在这个例子中,可以看到源程序的错误类型有两类:

警告错误(Warning Errors)。警告错误不影响程序的运行,但可能会得出错误的结果。此例中无警告错误。

严重错误(Severe Errors)。对于严重错误,MASM将无法生成OBJ文件。此例中有一个严重错误。

在错误信息中,园括号里的数字为有错误的行号(在此例中,错误出现在第13行),后面给出了错误类型及具体错误原因。如果出现了严重错误,你必须重新进入EDIT编辑器,根据错误的行号和错误原因来改正源程序中的错误,直到汇编没有错为止。

下面是改正之后0错误的编译结果:

spacer.gif

注意:汇编程序只能指出程序的语法错误,而无法指出程序逻辑的错误。

4.用LINK.EXE产生EXE可执行文件

在上一步骤中,汇编程序产生的是二进制目标文件(OBJ文件),并不是可执行文件,要想使我们编制的程序能够运行,还必须用连接程序(LINK.EXE)把OBJ文件转换为可执行的EXE文件。具体操作如下:

方法一:在Windows中操作

用资源管理器打开源程序目录C:\ASM,把HELLO.OBJ拖到LINK.EXE程序图标上。

方法二:在DOS命令提示符窗口中操作

选择“开始”→“所有程序”→“附件”→“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入LINK命令:

I:>C:<回车>

C:>CD \ASM<回车>

C:\ASM>LINK HELLO.OBJ<回车>

操作时的屏幕显示如图:

spacer.gif

不管用以上二个方法中的哪个方法,进入LINK程序后,都会提示让你输入可执行文件名(Run file),并在方括号中显示默认的可执行文件名,建议输入可执行文件的完整路径名,如:C:\ASM\HELLO.EXE〈回车〉。后面的两个提示为可选项,直接按回车。注意,若打开LINK程序时未给出OBJ文件名,则LINK程序会首先提示让你输入OBJ文件名(Object Modules),此时输入OBJ文件名HELLO.OBJ并回车,然后进行的操作与上面完全相同。

如果没有错误,LINK就会建立一个HELLO.EXE文件。如果OBJ文件有错误,LINK会指出错误的原因。如链接时有其它错误。须检查修改源程序,重新汇编、连接,直到正确。

经过生成后,ASM文件夹中的文件有:

spacer.gif

5.执行程序

建立了HELLO.EXE文件后,就可以直接在DOS下运行此程序,如下所示:

C:>HELLO〈回车〉

C:>

运行结果如下图:

spacer.gif

程序运行结束后,返回DOS。如果运行结果正确,那么程序运行结束时结果会直接显示在屏幕上。如果程序不显示结果,我们如何知道程序是否正确呢?这时,我们就要使用TD.EXE调试工具来查看运行结果。此外,大部分程序必须经过调试阶段才能纠正程序执行中的错误,调试程序时也要使用DEBUG.EXE。

6. 用DEBUG对exe文件进行调试

方法一:在Windows中操作

用资源管理器打开源程序目录C:\ASM,把HELLO.OBJ拖到LINK.EXE程序图标上。

方法二:在DOS命令提示符窗口中操作

选择“开始”→“所有程序”→“附件”→“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入LINK命令:

I:>C:<回车>

C:>CD \ASM<回车>

C:\ASM>LINK HELLO.OBJ<回车>

操作时的屏幕显示如图:

用R命令显示各寄存器内容:

spacer.gif

用U命令反汇编:

spacer.gif

对于其他命令在此就不再赘述,下面给出DEBUG常用命令表:

DEBUG常用命令汇总表:

命令

格式

功能

汇编

A   地址

A

从指定地址开始进行汇编

从上次A命令结束位置开始

显示内存单元内容

D   地址

D   地址范围

D  

从指定地址开始显示地址单元内容

显示指定范围内存储单元的内容

从上次D命令结束的位置开始显示

修改内存单元内容

E    地址内容表

E    地址

用内容表的内容代替指定地址开始的内容

显示和修改从指定地址开始的内容

运行

G=地址

G

G=地址,断点

从指定地址开始执行,直到结束

从当前位置开始执行,直到结束

从指定地址开始执行,直到断点位置结束

装入

L[地址]

把N命令给出的磁盘文件装入指定的地址或从CS:100开始的内存区

文件名

N  文件名

预先定义一个文件,如ABC.EXE

推出

Q

结束DEBUG的运行,返回DOS

显示和修改寄存器内容

R

R  寄存器名

显示所有寄存器的内容

显示并修改寄存器的内容

跟踪

T[=地址],[值]

T

从指定地址开始,执行一条或数条指令

从当前位置开始,执行一条指令

反汇编

U=地址

U  地址范围

从指定地址开始,反汇编成汇编源程序

把指定地址范围的机器指令,反汇编成汇编源程序

写盘

W

把指定地址或CS:100开始的内存块(块字节长度由BX:CX指定)以N命令给出的文件名写入磁盘


调试完后用Q命令退出DEBUG,下面给出DEBUG中标志位状态符号的含义:

标志

为1时

为0时

溢出OF

方向DF

中断IF

符号SF

零位ZF

辅助AF

奇偶PF

进位CF

OV

DN

EI

NG

ZR

AC

PE

CY

NV

UP

DI

PL

NZ

NA

PO

NC


二、运用debug工具实例

1. 有访存操作:

  MOV SI, 0050H          ;  (DS)=2000H

         MOV  DI,0100H          ;  (ES)=3000H

         MOV  CX, 5

         CLD

         REP MOVSB

1)先用A命令输入程序;

spacer.gif

2)用R命令修改DS和ES寄存器到约定值;

spacer.gif

DS 13D3为DS的原始值,:2000为输入的修改值

3)用D命令查看源数据区和目标数据区;

spacer.gif

4)用E命令初始化源数据区后再用D命令检查源数据区和目的数据区;

spacer.gif

5)单步跟踪执行程序;

spacer.gif

spacer.gifspacer.gif





6)执行后检查源数据区和目标数据区;

spacer.gif

注意:用A命令输入指令时,如果输入错误debug会立即指出错误和位置。地址不会变化,以便用户修正指令。

spacer.gif

2. 查看显卡信息

输入“D C000:0090”命令并回车,这时右侧部分可以看到系统中显卡的显存、生产厂商等信息。

3. 制作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下面运行也可以成功。知识不太稳定,有时会重新启动计算机。

4. 检测LCD显示器的坏点

购买LCD显示器最忌有亮点或暗点,我们可以借助相关的检测软件来辅助查看,但在配电脑时,老板常常不让我们装软件,其实利用Debug中的F命令就可以看得清清楚楚!
  为了检测LCD屏幕是否存在坏点,可以将整个屏幕填充为红、绿、蓝、白等纯色,以便检查。下面给出几个常用的显示屏检测F命令(Debug窗口一般较小,按Alt+Enter将它放大到整个屏幕):
F B800:00 F9F 20 70 全屏白色
F B800:00 F9F 20 40 全屏红色
F B800:00 F9F 20 20 全屏绿色
F B800:00 F9F 20 10 全屏蓝色
F B800:00 F9F C5 07 C4 07 全屏白色十字网格
F B800:00 F9F C5 04 C4 04 全屏红色十字网格
F B800:00 F9F C5 02 C4 02 全屏绿色十字网格
F B800:00 F9F C5 01 C4 01 全屏蓝色十字网格

5. 清除硬盘驱动器的所有信息

本来清除硬盘信息用Fdisk便可以轻松搞定,可如果当你碰上用FDISK命令无法删除分区信息的情况,甚至是一运行FDISK就死机,那么就不得不求助于Debug了。通过下面的命令,可以清除硬盘上所有分区信息。
小提示:危险操作!请慎重执行!
C:\>Debug
F 200 L1000 0
A CS:100
xxxx:0100 MOV AX,301
xxxx:0103 MOV BX,200
xxxx:0106 MOV CX,1
xxxx:0109 MOV DX,80 (注意:80代表主盘,81代表从盘)
xxxx:010C INT 13
xxxx:010E INT 20
xxxx:0110
g
Program terminated normally
q
  以上程序执行完毕后,重启电脑,此时硬盘的分区信息都已经被清除,我们便可以使用Fdisk为硬盘进行重新分区,然后格式化即可正常使用了。

小提示:删除所有分区
  如果想快速删除所有分区,那么可将以下命令保存到一个文本文件中(比如:  Delpart.txt ):
a 100 int13rax
0301
rbx
0200
f 200 l 200 0
rcx
0001
rdx
0080
p
q
  然后在纯DOS(比如用启动软盘启动系统)中执行“Debug

6. 拯救软盘数据

一分钟前还打得开的软盘,一分钟后就说“该软盘没有格式化,要格式化么?”但这里面却偏偏保存着重要数据,其实出现这种情况往往是软盘的0面0道1扇区逻辑损坏的原因,这时可以试试以下方法:
Step 1:将一张好的软盘插入软驱。
Step 2:执行Debug,并在提示符“-”后输入以下命令:
-L 100 0 0 1
Step 3:将好的软盘取出,插入需要恢复的软盘,再输入以下命令:
-W 100 0 0 1
  不过,如果0面0道1扇是物理损坏,DEBUG会告诉我们不能写盘,这时,你只能再尝试HD-COPY等工具软件了。

 7. 清除硬盘的主引导记录

如果你遇到了FDISK不能识别硬盘,或在电脑启动时出现没有硬盘的错误提示,比如:“Fixeddisk 0 Failure”,那么可以试试下面的方法,但是要注意的是,这样会删除所有硬盘分区(包括非DOS分区),当然数据也会全部丢失。
Step 1:制作一张启动软盘,其中包括:DEBUG、FDISK、FORMAT等程序。用它启动电脑,输入“Debug”并回车。
Step 2:在Debug的命令提示符“-”后输入以下命令:
FCS:200 400 0
RAX
0301
RBX
0600
RCX
0001
RDX
0080
E 100 CD 13
P
Q
Step 3:完成后分别运行FDISK和Format进行分区和格式化即可。

三、总结

自古成功在尝试,经过这次学习以及实践debug,一开始尝试,结果导致桌面的文件内容都变成了汇编代码,不过最后把问题都解决了!

小小总结如下:

态度上:我花了将近两个星期的时间,完成了这次的debug使用的作业,从一开始我就没有把这次作业当成作业,而是抱着将课堂上学习的理论知识与实践结合,并将理论运用到实际的态度去完成的,虽然一开始很茫然,不知道从何着手开始写。

方法上:通过查阅相关的书籍,结合网上的资料,还有一些相关的科技论文,自己整理好思路,一步一步的慢慢尝试,到最后实现。

效果上:由于时间所限及语言本身的复杂度,因此还有很多知识点没有完全理解,但是通过努力,也学到了很多的知识,觉得debug真的很强大。

收获上:通过自己动手实践,深刻理解了“行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧”。