中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
作者:
标题: debug 写内存 上一主题 | 下一主题
xiaokeyong
初级用户

小菜鸟


积分 122
发帖 15
注册 2003-5-27
状态 离线
『楼 主』:  debug 写内存 使用 LLM 解释/回答一下

小菜鸟 想破解硬盘还原卡,用debug 命令写内存 可发现 不可在0000:xxxxx 和f000:xxxxx段写东西, 其他的还可以写的 不知为何?!·#!· 还有我用A启动计算机,想进win c:\windows\win可不能用,??·#¥?·#?????!!


2003-5-27 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
如是大师
元老会员

步行的人


积分 9654
发帖 3351
注册 2003-3-11
来自 湖北
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

0000:xxxxx 和f000:xxxxx这两个地址段被dos占用了。
你的msdos文件编辑过吗?




弄花香满衣,掬水月在手。
明月鹭鸟飞, 芦花白马走。
我自一过后,野渡现横舟。
青云碧空在,净瓶水不流。
http://dos.e-stone.cn/guestbook/index.asp
======中國DOS聯盟=====
我的新网页http://rsds.7i24.com欢迎光顾
2003-5-27 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
xiaokeyong
初级用户

小菜鸟


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

没有呀! 因为有硬盘还原卡, 我想编辑了用处也不大,不是要重启动才行吗
??


2003-5-28 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
如是大师
元老会员

步行的人


积分 9654
发帖 3351
注册 2003-3-11
来自 湖北
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

看看wengier启动盘里的msdos文件和你的有什么不同。。




弄花香满衣,掬水月在手。
明月鹭鸟飞, 芦花白马走。
我自一过后,野渡现横舟。
青云碧空在,净瓶水不流。
http://dos.e-stone.cn/guestbook/index.asp
======中國DOS聯盟=====
我的新网页http://rsds.7i24.com欢迎光顾
2003-5-29 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
xiaokeyong
初级用户

小菜鸟


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

我不是很懂的呀! 什么是wengier启动盘呀!!!


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




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

有哪位高手能告诉我学习debug命令的详细资料?


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




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

我也想学debug 命令的详细资料,请各位多多指教


2003-10-17 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
E网飞鸿
初级用户




积分 143
发帖 9
注册 2003-10-25
状态 离线
『第 8 楼』:   使用 LLM 解释/回答一下

http://www.myskill.net/toolbox/web/debug.htm
这个应该能满足你


2003-10-28 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
wphs0326
银牌会员

爱DOS但不迷DOS


积分 1708
发帖 509
注册 2004-2-25
来自 安徽淮南
状态 离线
『第 9 楼』:   使用 LLM 解释/回答一下

以下是引用E网飞鸿在2003-10-28 15:56:55的发言:
http://www.myskill.net/toolbox/web/debug.htm
这个应该能满足你
打不开呀




°·.∴▍★∴ 我们的泰坦尼克.....
   I l☆ve you!
☆.°·▍▍.☆█☆.°★ 永不会沉没.
◥█▅▅██▅▅██▅▅▅▅███◤
我的主页:http://wphs.ik8.com我的网络硬盘:wphs.ys168.com
Email:wphs@ah163.com QQ:43500498(附加消息:中国DOS联盟)
2004-3-21 00:00
查看资料  发送邮件  访问主页  发短消息  网志  OICQ (43500498)  编辑帖子  回复  引用回复
hendry2003
初级用户




积分 192
发帖 20
注册 2004-3-22
来自 上海市
状态 离线
『第 10 楼』:   使用 LLM 解释/回答一下

我也是打不开




**************%%%%%%%%%************

我是大菜鸟,渴望成为一个能独立飞翔的老鸟
请各位大 虾不吝赐教,小弟在此谢谢了。

**************%%%%%%%****************
2004-5-5 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
jzhupo
中级用户




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

转载
* 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

功能: 求十六进制数和的和与差并显示结果。

8. 端口输入命令I

格式: I

功能: 从指定端口接收信息并将输入的内容显示出来。

* 9. 读盘命令L

格式: L

其中的缺省值为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

-L

将当前驱动器上的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以每位的形式显示,详见表5-1。

表5-1 状态标志显示形式
标志位


溢出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

-R F

15. 搜索指定内存命令S

格式: S

功能:在指定范围搜索表中内容,找到后显示表中元素所在地址

例如:-S CS:100 110 41

显示:04BA:0104

04BA:010D

表示在位移100H至110H间的上述两处有41H。又如:

-S C3:100 L 11 41“AB”E

表示在当前代码段位移100H至111H处寻找连续4个字节内容为41H、41H、42H、0EH的起始单元地址。

* 16. 执行并显示系统环境命令T

格式:T

功能:执行由指定地址起始的、由指定的若干条命令。其中的缺省值是当前IP值,的缺省值是一条。

例如:-T 执行当前指令并显示状态

-T 10 从当前指令始执行10H条指令

* 17. 反汇编命令U

格式:U

上式等价于:

(1) U

(2) U

(3) U

功能:将指定范围内的代码以汇编语句形式显示,同时显示地址及代码。注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果。地址及范围的缺省值是上次U指令后下一地址的值。这样可以连续反汇编。

* 18. 写盘命令W

格式:W

功能:与L命令不同的地方是将内存从起始的一片单元内容写入指定扇区。只有W而没有参数时,与N命令配合使用将文件写盘。

注:要求读者对其中打"*"的DEBUG命令必须能熟练使用。



第三节 在DEBUG环境下执行汇编指令

本节从几个典型例子出发,通过上机实习,引导读者学会使用DEBUG调试程序运行汇编语言程序,以便读者在以后的学习中能够有一个熟练的调试和运行手段。

在进入DEBUG的提示符‘-’之后,用户可以通过DEBUG的命令输入汇编源程序,并用相应命令将其汇编成机器语言程序;然后调试并运行该程序。

例1 在DEBUG下运行如下程序。

MOV DL,33H ;字符3的ASCII码送DL

MOV AH,2 ;使用DOS的2号功能调用

INT 21H ;进入功能调用,输出‘3’

INT 20H ;BIOS中断服务程序,正常结束。

该程序运行结果是在显示器上输出一个字符‘3’。如果要输出其它字符,请改变程序中‘33H’为相应字符的ASCII码。

运行步骤:

(1)进入DEBUG

设DEBUG.EXE位于C盘DOS子目录,进入DOS后键入DEBUG ,即

C:\DOS>DEBUG

屏幕显示: -

‘-’号是进入DEBUG的提示符,在该提示符下可键入任意DEBUG命令。现在用A命令送程序如下:

(2)送程序并汇编

-A 100

169C:0100 MOV DL,33

169C:0102 MOV AH,2

169C:0104 INT 21

169C:0106 INT 20

169C:0108

-

至此程序已送完,汇编成机器指令,顺序存放于CS段100H起始的8个存储单元。

如果在汇编后想看一下机器指令是什么样子的话,方法之一是可以用反汇编命令U作如下操作:

(3)反汇编

-U 100 108

169C:0100 B233 MOV DL,33

169C:0102 B402 MOV AH,02

169C:0104 CD21 INT 21

169C:0106 CD20 INT 20

169C:0108

-

右边是汇编指令,中间是该汇编指令的机器码,左边是存放该条指令的内存单元地址。

(4)运行程序

-G

3

Program terminated normally

-

(5)写COM文件

-R BX

BX 0000

:

-R CX

CX 0000

:A

-N EXCOM.COM

-W

-

其中(BX)*10000H+(CX)用于指定所写的字节数,(BX)为该数的高16位,(CX)为该数的低16位。因此,上面的过程实际上是要将A个字节写入文件EXCOM.COM。

(6)送机器指令程序

-E 200 B2 33 B4 02 CD 21 CD 20

-

(7)显示内存

-D 200 208

169C:0200 B2 33 B4 02 CD 21 CD 20-61 . 3 . . . ! . . a

-

(8)执行机器指令程序

-G=200

3

Program terminated normally

-

(9)退出DEBUG返回DOS,执行EXCOM.COM文件

-Q

C:\DOS>EXCOM

3

C:\DOS>

例2 进入DEBUG,用A命令送字节数据加法程序,用R命令显示状态,并用T命令单条执行

(1)进入并用A命令写入汇编源程序

C:\DOS>DEBUG

-A

1392:0100 MOV AH,3

1392:0102 MOV AL,2

1392:0104 ADD AL,AH

1392:0106 INT 20

1392:0108

-

(2)用R命令显示寄存器状态

-R

AX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=1392 ES=1392 SS=1392 CS=1392 IP=0100 NV UP EI PL NZ NA PO NC

1392:0100 B403 MOV AH,03

-

(3)用G命令执行,但看不到计算结果。

-G

Program terminated normally

-

(4)用T命令单条执行,可以看到中间结果。

-T

AX=0300 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=1392 ES=1392 SS=1392 CS=1392 IP=0102 NV UP EI PL NZ NA PO NC

1392:0102 B002 MOV AL,02

-T

AX=0302 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=1392 ES=1392 SS=1392 CS=1392 IP=0104 NV UP EI PL NZ NA PO NC 1392:0104 00E0 ADD AL,AH

(5)再执行T命令,可以看到最终结果,(AL)=5

-T

AX=0305 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=1392 ES=1392 SS=1392 CS=1392 IP=0106 NV UP EI PL NZ NA PO NC

1392:0106 CD02 INT 20

-T

AX=0305 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=1392 ES=1392 SS=1392 CS=011C IP=1094 NV UP DI PL NZ NA PO NC

011C:1094 90 NOP

-

(6)退出

-Q

C:\DOS>



2004-7-16 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
jzhupo
中级用户




积分 347
发帖 53
注册 2004-7-4
状态 离线
『第 12 楼』:   使用 LLM 解释/回答一下

例3 在DEBUG下运行下述程序,查看执行结果,并将其作为可执行文件存入A盘。

MOV AX,0FEH ;被乘数0FEH送AX

MOV CL,2

SHL AX,CL ;被乘数乘以4,结果送AX

MOV BX,AX ;被乘数乘以4的结果送BX保留

MOV CL,2

SHL AX,CL ;被乘数乘以16,结果送AX

ADD AX,BX ;被乘数乘以20,结果在AX中

MOV ,AX ;将积存入DS段第300H—301H号内存单元

MOV AH,4CH ;将功能号4CH送AH

INT 21H ;执行DOS的4CH号功能调用,结束程序返回DOS。

该程序运行结果是将0FEH乘以14H,结果放在DS段第300H—301H号内存单元中。

(1)进入DEBUG,显示300H至301H号内存单元内容

C:\DOS>DEBUG

-D 300 301

1392:0300 00 00 . .

-

(2)用A命令装入程序段并汇编

-A

1392:0100 MOV AX,0FE

1392:0102 MOV CL,2

1392:0104 SHL AX,CL

1392:0106 MOV BX,AX

1392:0108 MOV CL,2

1392:010A SHL AX,CL

1392:010C ADD AX,BX

1392:010E MOV ,AX

1392:0111 MOV AH,4C

1392:0113 INT 21

1392:0116

-

(3)用G命令执行到断点处(程序正常结束前)停止

-T=100,8

AX=13D8 BX=3F80 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=1392 ES=1392 SS=1392 CS=1392 IP=0111 NV UP DI PL NZ NA PO NC

1392:0111 B44C MOV AH,4C

-

(4)用D命令显示300H至301H的内容(最终结果)

-D 300 301

1392:0300 D8 13 ..

-

(5)用R命令指定写盘文件长度

-R BX

BX 3F80

:0

-R CX

CX 0000

:16

-

(6)用N命令命名写盘文件

-N A:YWZCHF.COM

(7)用W命令写盘

-W

-

(8)用Q命令退出DEBUG环境,返回DOS

-Q

C:\DOS>

(9)在DOS环境运行YWZCHF.COM

C:\DOS>A:YWZCHF

C:\DOS>

(10)将YWZCHF.COM装入内存运行

C:\DOS>DEBUG

-N A:YWZCHF.COM

-L

-T=100,8

AX=13D8 BX=3F80 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=1392 ES=1392 SS=1392 CS=1392 IP=0111 NV UP DI PL NZ NA PO NC

1392:0111 B44C MOV AH,4C

-D 300 301

1392:0300 D8 13 ..

(11)用Q命令退出DEBUG环境,返回DOS

-Q

C:\DOS>

例4 在DEBUG环境下,送入一个加法源程序并汇编成可执行代码;将其作为可执行文件JIAFA.COM存储到A盘;在DOS命令行执行可执行文件JIAFA.COM;进入DEBUG,将可执行文件JIAFA.COM装入内存CS:100H处运行,并用T命令查看运算结果。

C:\DOS>debug

-A

169C:0100 MOV AX,8A6D

169C:0103 ADD AX,0382

169C:0106 MOV ,AX

169C:0109 MOV AH,4C

169C:010B INT 21

169C:010D

-R BX

BX 0000

:

-R CX

CX 0000

<img src="images/smilies/face-smile-big.png" align="absmiddle" border="0">

-N A:JIAFA.COM

-W

-Q

C:\DOS>

C:\DOS>DEBUG

-N A:JIAFA.COM

-L

-G

Program terminated normally

-T=100,3

AX=8DEF BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=1392 ES=1392 SS=1392 CS=1392 IP=0109 NV UP DI PL NZ NA PO NC

1392:0111 B4 4C MOV AH,4C

-D 200 201

169C:0200 EF 8D ..

-Q

C:\DOS>



第四节 使用DEBUG调试和运行可执行文件

事实上,在第三节例题中已经对使用DEBUG命令调试和运行可执行文件有所接触。本节只需对使用DEBUG调试和运行可执行文件的一般步骤做一介绍,并通过一个含有错误的程序来对程序调试进行实践。

用户程序经过编辑、汇编、连接后得到一个可执行文件(.EXE),这时借助于调试程序DEBUG对用户程序进行调试,查看程序是否能完成预定功能。对于初学者,如何选用DEBUG中各命令,有效地调试与运行程序,需要一个学习过程。在初次使用DEBUG时,可参照下列步骤进行。

1.调用DEBUG,装入用户程序

可以在调用DEBUG是直接装入用户程序可执行文件,也可以在进入DEBUG环境后使用N命令和L命令装入用户程序可执行文件。无论用哪种方法,装入用户程序可执行文件时,一定要指定文件全名(即文件名和扩展名)。

2.观察寄存器初始状态

程序装入内存后,用R命令查看寄存器内容。从各段寄存器现在的内容,便能了解用户程序各逻辑段(代码段,堆栈段等)在内存的分布及其段基值。R命令亦显示了各通用寄存器和标志寄存器的初始值,显示的第三行就是即将执行的第一条指令。

3.以单步工作方式开始运行程序

首先用T命令顺序执行用户程序的前几条指令,直到段寄存器DS和/或ES已预置为用户的数据段。在用T命令执行程序时,每执行一条指令,显示指令执行后寄存器的变化情况,以便用户查看指令执行结果。

4.观察用户程序数据段初始内容

在第3步执行后DS和/或ES已指向用户程序的数据段和附加段,这时用D命令可查看用户程序的原始数据。

5.继续以单步工作方式运行程序

对于初学者,一般编写的程序比较短,用T命令逐条执行指令,可清楚地了解程序的执行过程:现在执行的是什么指令,执行后的结果在哪里(寄存器,存储单元)?所得结果是否正确?…等等。在逐次使用T命令时,若有需要,可选用D命令了解某些内存单元的变化情况。

用T命令逐条执行程序时,如遇上用户程序中的软中断指令INT(如INT 21H),这时,通常不要用单步工作方式执行INT指令。因为系统提供的软中断指令INT是以中断处理子程序形式实现功能调用,且这种处理子程序常常是较长的。若用T命令去执行INT指令,那么将跳转到相应的功能调用于程序中,要退出该子程序需要化费较多时间。如果既要执行INT指令,又要跳过这段功能调用子程序,则应使用连续工作方式(G命令),且设置断点,其断点应为INT指令的下一条指令。例如要以单步工作方式执行下面一段程序:

10B0:0022 MOV DX,0010

10B0:0026 MOV AH,09

10B0:0028 INT 21

10B0:002A MOV CX,00

当用T命令完成“MOV AH,09”指令后,应使用G命令:

-G 002A

这样,以连续工作方式实现功能调用后,即暂停在偏移量为002A的“MOV CX,00”指令处(未执行),如同用单步工作方式完成INT指令的执行一样。

6.连续工作方式运行程序

在用单步工作方式运行程序后,可再用连续工作方式从头开始运行程序,查看运行结果。在用G命令时,注意指定运行程序的起始地址。若G命令中未指定起始地址,就隐含为从当前CS:IP指向的指令开始。

7.修改程序和数据

经过上面几步后,若发现程序有错,则需要适当进行修改。这时,如果仅需作个别修改,可在DEBUG状态下,使用A命令。这种修改仅仅是临时修改内存中的可执行文件,未涉及源程序。当确认修改正确后,应返回至编辑程序,修改源程序,然后再汇编、连接。

为了确认用户程序的正确性,常常需用几组不同的原始数据去运行程序,查看是否都能获得正确结果。这时,可用E命令在用户程序的数据段和附加段中修改原始数据,然后再用T命令或G命令运行程序,查看运行结果,直到各组数据都能获得正确结果为止。

8.运用断点调试程序

如果已确认程序是正确的,在连续工作方式下,可快速地运行程序;如果已知程序运行结果不正确,用G命令运行程序,中途不停,很难查找错误。改用T命令,虽然可以随意暂停程序的执行,但是运行速度慢,如果运用断点,可快速查找错误。这里的“断点”是程序连续运行时要求暂停的指令位置(地址),用要求暂停的一条指令首字节地址表示。当程序连续运行到这断点地址时,程序就暂停,并显示现在各寄存器内容和下面将要执行的指令(即断点处指令)。为了准确设置断点,可用反汇编命令U 察看源程序。运用断点,可以很快地查找出错误发生在哪一个程序段内,缩小查找错误的范围。然后在预计出错的范围内,再用T命令仔细观察程序运行情况,确定出错原因和位置,完成程序的调试。

例5 现有一个双字加法源程序如下,其中存在错误。现假设已汇编、连结生成了可执行文件SZJiaFa.EXE,存放在C:\DOS目录下。请使用DEBUG对其进行调试。

Code SEGMENT

ASSUME CS:code,DS:code

ORG 100H ;从100H处开始存放下列指令

Start:MOV AX,code ;将DS置成code段的首地址

MOV DS,AX

MOV SI,200H ;取第一个数的首地址

MOV AX, ;将第一个数的低16位取到AX

MOV DI,204H ;取第二个数的首地址

ADD AX, ;第一个数和第二个数的低16应相加

MOV ,AX ;低16位相加的结果送到208H和209H单元

MOV AX, ;取第一个数的高16位送到AX中

ADD AX, ;两个数的高16位相加

MOV ,AX ;高16位相加的结果送到20AH,20BH单元

MOV AX,4C00H ;使用DOS的4CH号功能调用

INT 21H ;进入功能调用,返回DOS

ORG 200H ;从200H处开始存放下列数据

DD 12345678h,654387A9h,0h ;被加数、加数、和

Code ENDS

END start

调试过程:

(1)进入DEBUG并装入可执行文件SZJiaFa.EXE

C:\DOS>DEBUG SZJiaFa.EXE

-

(2)观察寄存器初始状态

-R

AX=0000 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=1892 ES=1892 SS=18A2 CS=18A2 IP=0100 NV UP EI PL NZ NA PO NC

18A2:0100 B8A218 MOV AX,18A2

(3)以单步工作方式开始运行程序

首先用T命令顺序执行用户程序的前l两条指令,将段寄存器DS预置为用户的数据段。

-T

AX=18A2 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=1892 ES=1892 SS=18A2 CS=18A2 IP=0103 NV UP EI PL NZ NA PO NC

18A2:0103 8ED8 MOV DS,AX

-T

AX=18A2 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=0105 NV UP EI PL NZ NA PO NC

18A2:0105 BE0002 MOV SI,0200

(4) 观察用户程序数据段初始内容

-D 200 20F

18A2:0200 78 56 34 12 A9 87 43 65-00 00 00 00 00 74 13 50 xV4...Ce.....t.P

-

(5) 连续工作方式运行程序至返回DOS前(设断点),查看运行结果。为此,现使用U命令反汇编。

-U 100

18A2:0100 B8A218 MOV AX,18A2

18A2:0103 8ED8 MOV DS,AX

18A2:0105 BE0002 MOV SI,0200

18A2:0108 8B04 MOV AX,

18A2:010A BF0402 MOV DI,0204

18A2:010D 0305 ADD AX,

18A2:010F 894408 MOV ,AX

18A2:0112 8B4402 MOV AX,

18A2:0115 034502 ADD AX,

18A2:0118 89440A MOV ,AX

18A2:011B B8004C MOV AX,4C00

18A2:011E CD21 INT 21

-

可见,要执行10条指令,至011B处停止

-G=100,011B

AX=7777 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204

DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=011B NV UP EI PL NZ NA PE NC

18A2:011B B8004C MOV AX,4C00

-D 200 20F

18A2:0200 78 56 34 12 A9 87 43 65-21 DE 77 77 43 43 83 06 xV4...Ce!.wwCC..

-

和为7777DE21H,正确。

(6) 再取一组数据,查看运行结果。为此,首先用E命令修改数据。

-E 200 CD,AB,78,56,90,EF,34,12

-D 200 20F

18A2:0200 CD AB 78 56 90 EF 34 12-21 DE 77 77 43 43 83 06 ..xV..4.!.wwCC..

-G=100,11B

AX=68AC BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204

DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=011B NV UP EI PL NZ NA PE NC

18A2:011B B8004C MOV AX,4C00

-D 200 20F

18A2:0200 CD AB 78 56 90 EF 34 12-5D 9B AC 68 43 43 83 06 ..xV..4.]..hCC..

-

和为68AC9B5DH,错误。说明程序有问题。

(7) 再将断点设在完成低位字加法后,查看运行结果。

-G=100,112

AX=9B5D BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204

DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=0112 NV UP EI NG NZ NA PO CY

18A2:0112 8B4402 MOV AX, DS:0202=5678

-D 200 20F

18A2:0200 CD AB 78 56 90 EF 34 12-5D 9B AC 68 43 43 83 06 ..xV..4.]..hCC..

-

低位和为9B5D,正确。说明错误可能出在后面

(8) 使用T命令从刚才的断点处向后单步调试,查看运行结果。

-T=112

AX=5678 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204

DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=0115 NV UP EI NG NZ NA PO CY

18A2:0115 034502 ADD AX, DS:0206=1234

-T

AX=68AC BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204

DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=0118 NV UP EI PL NZ NA PE NC

18A2:0118 89440A MOV ,AX DS:020A=68AC

-

AX寄存器的结果为68AC,而应为68AD。可见是本条加法指令使用错误,这里应使用带进位加法指令。

(9)使用A命令装入正确指令后再次运行,察看结果。

-A 115

18A2:0115 ADC AX,

18A2:0118

-G=100,11B

AX=68AD BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204

DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=011B NV UP EI PL NZ NA PO NC

18A2:011B B8004C MOV AX,4C00

-D 200 20F

18A2:0200 CD AB 78 56 90 EF 34 12-5D 9B AD 68 43 43 83 06 ..xV..4.]..hCC..

-

和为68AD9B5DH,正确。对于这样一个简单程序一般来说不会再有问题。退出后修改源程序即可。

(10)退出

-Q

C:\DOS>

需要说明的是此程序很简单,只需使用T命令逐条单步调试即可。本例采用的调试方法似乎过于繁琐,但这是为了说明程序调试的一般方法,以便读者调试复杂程序时借鉴。



2004-7-16 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
lafargefox
初级用户




积分 29
发帖 8
注册 2006-5-12
来自 四川
状态 离线
『第 13 楼』:   使用 LLM 解释/回答一下

真是太羡慕楼上的高手啊!!我盲目的顶哈!


2006-5-16 00:37
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
wl00560
银牌会员





积分 1384
发帖 709
注册 2005-10-29
状态 离线
『第 14 楼』:   使用 LLM 解释/回答一下

晕了……


2006-5-16 00:40
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
wskgxwyg2000
新手上路





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

谢谢楼主!辛苦了!


2006-5-18 12:37
查看资料  发短消息  网志  OICQ (229537379)  编辑帖子  回复  引用回复

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


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



论坛跳转: