debug调试.docx
- 文档编号:14093806
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:17
- 大小:204.45KB
debug调试.docx
《debug调试.docx》由会员分享,可在线阅读,更多相关《debug调试.docx(17页珍藏版)》请在冰点文库上搜索。
debug调试
DEBUG调试
DEBUG.EXE是Windows自带的用于调试可执行程序的一个工具软件,可在命令提示符下调入,同时也是进行汇编语言程序设计的一种最有效的调试工具。
由于DEBUG调试程序可以对单条指令或几条指令组成指令序列进行汇编、执行,并可以观察到指令执行前后在寄存器或内存中的结果,并对指令中错误的使用予以拒绝汇编,对于初学指令的读者,通过DEBUG调试程序对指令的调试,不但对指令的功能,格式,影响FLAGS寄存器的状况有个直观的了解,还可以进一步了解数据在计算机中存放的格式、使用指令时应该注意的问题乃至计算机的工作原理。
1DEBUG命令格式
1.1DEBUG调试程序的启动
在命令提示符下,可键入如下命令启动DEBUG调试程序:
DEBUG[路径\文件名][参数1][参数2]
[路径\文件名]是供DEBUG调试程序调试的程序名称及路径。
若Debug后不带文件名,仅运行Debug程序,在需要时,再用N和L命令调入被调试程序;若命令中带有被调试程序名,则运行Debug的同时,还将指定的程序调入主存;[参数1][参数2]被调试程序所需要的参数。
“DEBUG文件名”方式的调试方式
只启动DEBUG的调试方式
在Debug程序调入后,根据有无被调试程序及其类型相应设置寄存器组的内容,发出Debug的提示符,此时就可用Debug来调试程序。
若启动DEBUG调试程序时,被调试程序扩展名是.EXE,则需要重新定位。
此时,CS:
IP和SS:
SP根据被调试程序确定,分别指向代码段和堆栈段。
DS=ES指向当前可用的主存段,BXCX包含被调试文件大小字节数(BX为高16位),其他通用寄存器为0,状态标志都是清0状态。
如上图所示,被调试的程序名是XIANSHI.EXE,在DEBUG调试程序提示符“-”下键入R命令,是显示当前CPU中所有寄存器的值,可见,CS:
IP=0B60H:
0000H(DEBUG调试程序中所有的数据均为十六进制,但不加尾标H),
SS:
SP=0B4BH:
0000H,是由被调试的程序XIANSHI.EXE决定的,分别指向代码段和堆栈段。
DS=ES=0B3BH,BXCX=000001A4H,表示被调试的文件XIANSHI.EXE的大小是000001A4H字节,其它寄存器均为0,而NVUPEIPLNZNAPONC表示FLAGS寄存器的OF=0,DF=0,IF=1,SF=0,ZF=0,AF=0,PF=0,CF=0。
标志位的符号表示如下表所示:
标志位
代表1的符号
代表0的符号
OF
OV
NV
DF
DN
UP
IF
EI
DI
SF
NG
PL
ZF
ZR
NZ
AF
AC
NA
PF
PE
PO
CF
CY
NC
若启动DEBUG调试程序时,不带被调试程序,则所有段寄存器值相等,都指向当前可用的主存段;除SP之外的通用寄存器值都设置为0,而SP指示当前堆栈顶在这个段的尾部;IP=0100H;状态标志都是清0状态。
如下图所示:
若启动DEBUG调试程序时,被调试程序扩展名不是.EXE,则(BX∥CX)包含被调试文件大小的字节数(BX为高16位),其他同不带被调试程序的情况。
如下图所示:
由图可见,被调试的程序名是XIANSHI.OBJ,在DEBUG调试程序提示符“-”下键入R命令,显示当前CPU中所有寄存器的值,除(BX∥CX)=00000216H为被调试的程序XIANSHI.OBJ的大小,其余和不带被调试程序的情况相同。
1.2DEBUG命令的格式
Debug的命令都是一个字母,后跟一个或多个参数,即:
字母[参数]。
在使用DEBUG命令时应注意:
(1)字母不分大小写,如A和a;
(2)只使用16进制数,没有后缀字母H或h;
(3)分隔符(空格或逗号)只在两个数值之间是必须的,命令和参数间可无分隔符
(4)每个命令及参数输入后必须按回车键后才有效,可以用Ctrl+Break中止命令的执行;
(5)命令如果不符合Debug的规则,则将以“error”提示,并用“^”指示错误位置。
(6)许多与内存单元有关的DEBUG命令的参数是内存物理地址,形式是“段地址:
偏移地址”。
其中:
段地址可以是段寄存器名称或具体的数值;偏移地址是数值。
如果不输入段地址,则采用默认值,可以是默认段寄存器值。
如果没有提供偏移地址,则通常就是当前偏移地址。
对内存单元操作的命令还支持地址范围这种参数,它的形式是“开始地址结束地址”(结束地址不能具有段地址),或者是“开始地址L字节长度”。
2常用DEBUG命令
2.1、显示内存单元内容命令D(DUMP)
2.2、修改命令E(Enter)
2.3、填充命令F(Fill)
2.4、寄存器命令R(Register)
2.5、汇编命令A(Asemble)
2.6、反汇编命令U(Unassemble)
2.7、运行命令G(Go)
2.8、跟踪命令T(Trace)
2.9、继续命令P(Proceed)
2.10、退出命令Q(Quit)
2.1显示内存单元内容命令D(DUMP)
D命令显示内存单元的内容,它的格式有以下两种:
(1)D地址
功能:
显示当前或指定开始地址的内存内容,如下图:
由图可见,在DEBUG调试程序的提示符下,键入D命令,显示当前内存内容(若前面已有D命令,则接着上一次D命令显示的最后一个字节显示)。
一个D命令一次显示连续8×16字节单元的内容,对于每一行,最左边部分0AF5:
0100是内存物理地址,其中,0AF5H是数据段的段地址,0100H是该段的偏移地址;中间是连续16个字节的内存内容(16进制数,以字节为单位),右边部分是这个16个字节内容的ASCII字符显示,不可显示字符用点“.”示。
在DEBUG调试程序的提示符下,键入D0000:
0010命令,显示从物理地址为0000H:
0010H字节单元开始的连续8×16字节单元的内容,其余情况同D命令。
(2)D范围
功能:
显示指定范围的主存内容,如图所示:
由图可见,在DEBUG调试程序的提示符下,键入D0000:
00100026命令,显示从物理地址为0000H:
0010H到物理地址为0000H:
0026H共23个字节单元的内容;在DEBUG调试程序的提示符下,键入DDS:
0100011F命令,显示从数据段偏移地址为0100H(物理地址为(DS):
0100H)到数据段偏移地址为011FH共32个字节单元的内容;在DEBUG调试程序的提示符下,键入D0100L20命令,显示从从数据段偏移地址为0100H开始连续20H(32个)个字节单元的内容。
2.2修改命令E(Enter)
E命令用于修改内存单元的内容,它有两种格式:
(1)E地址
功能:
逐个单元相继修改指定地址的内容,如图所示:
由图可见,在DEBUG调试程序的提示符下,键入EDS:
0100命令,DEBUG显示对应字节单元的内容,紧接着光标闪烁,提示用户可以直接输入新数据,然后按空格键显示下一个单元的内容,或者按“-”键显示上一个单元的内容;不需要修改可以直接按空格或“-”键;这样,用户可以不断修改相继单元的内容,直到用回车键结束该命令为止。
在上图中一共修改了16个字节单元的内容,均改为0FFH,然后我们再用D命令查看,前16个字节均已被修改为0FFH。
(2)E地址数据表
功能:
用数据表的数据修改指定地址的内容,可以一次修改多个单元。
如图所示:
由图可见,在DEBUG调试程序的提示符下,先键入D0100命令,查看对应内存单元的内容,然后用E命令修改前8个字节单元的内容,分别修改为00H,01H,02H,03H,04H,05H,06H,07H,再用D命令查看,前8个字节单元已被修改为数据表的内容。
2.3填充命令F(Fill)
F命令用于对一个内存区域填写内容,同时改写原来的内容,其格式为:
F范围数据表
功能:
用数据表的数据写入指定范围的内存。
如果数据个数超过指定的范围,则忽略多出的项;如果数据个数小于指定的范围,则重复使用这些数据,直到填满指定范围。
如图所示:
由图可见,在DEBUG调试程序的提示符下,先键入D0100012F命令,查看指定范围的内存单元的内容,然后用F命令向指定范围的字节单元写入数据表的内容,数据表的内容为00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH,再用D命令查看指定范围的内存单元,由于数据表的内容小于指定的范围,所以第2、3行重复数据表的内容。
2.4寄存器命令R(Register)
R命令用于显示和修改处理器的寄存器,它有三种格式:
(1)R
功能:
显示所有寄存器内容、标志位状态及下一条要执行的指令,如图所示:
由图可见,在DEBUG调试程序的提示符下,键入R命令,显示所有寄存器内容和标志位状态,前两行给出所有寄存器的值,包括各个标志状态。
最后一行给出了当前CS:
IP处的指令,由于这是一个涉及数据的指令,这一行的最后还给出了相应单元的内容。
(2)R寄存器名称
功能:
显示和修改指定的寄存器,如图所示:
由图可见,在DEBUG调试程序的提示符下,键入RAX命令,显示AX寄存器内容为0000H,并回车换行,显示“∶”,并紧接着光标闪烁,提示可以输入新的内容,键入1200,即将AX寄存器的内容由0000H修改为1200H,依此类推,显示并修改CX寄存器,最后,键入R命令,显示所有寄存器的内容,发现AX和CX的内容确实已按要求修改了。
(3)RF
功能:
显示和修改FLAGS寄存器的OF,DF,IF,SF,ZF,AF,PF,CF位。
如图所示:
由图可见,在DEBUG调试程序的提示符下,键入RF命令,显示FLAGS寄存器的OF,DF,IF,SF,ZF,AF,PF,CF位的情况为NVUPEIPLNZNAPONC紧接着光标闪烁,提示可以键入新的内容予以修改,键入-OVDNDINGZRACPECY,再键入R命令,可以看出FLAGS寄存器的OF,DF,IF,SF,ZF,AF,PF,CF位已经修改为OVDNDINGZRACPECY
2.5汇编命令A(Asemble)
A命令用于汇编指令,即将输入的指令汇编成对应的机器语言,存入指定的内存区域,它有两种格式:
(1)A
功能:
若还没有使用过A命令,则从当前CS:
IP开始汇编指令,若已使用过A命令,接着上一个A命令的最后一个单元开始汇编指令。
DEBUG调试程序将他们汇编成机器代码,相继地存放在指定地址开始的存储区中,最后要输入一个回车结束A命令。
如图所示:
由图可见,在DEBUG调试程序的提示符下,键入A命令,DEBUG调试程序显示0AF3:
0100,这是当前的CS:
IP值,接着输入MOVAX,1234指令,该指令被汇编成机器语言,共3个字节,所以下一条指令MOVBX,5678从0AF3:
0103处汇编起,依次类推,其汇编成的机器语言可用反汇编U命令查看,中间部分即是对应的机器语言。
(2)A地址
功能:
从指定地址开始汇编指令,如图所示:
2.6反汇编命令U(Unassemble)
U命令用于反汇编,即显示指定内存单元中的机器语言及其对应的指令。
它有两种格式。
(1)U地址
功能:
从指定地址开始,反汇编32个字节(80列显示模式)。
U命令中如果没有指定地址,则接着上一个U命令的最后单元开始;若还没有使用U命令,则从当前CS:
IP开始。
如图所示:
由图可见,调试可执行文件XIANSHI.EXE,键入U命令,DEBUG调试程序对可执行文件XIANSHI.EXE进行反汇编,从当前的CS:
IP开始,即从0B60H:
0000H开始.
(2)U范围
功能:
对指定范围的内存单元内容进行反汇编,如图示。
2.7运行命令G(Go)
G命令用来连续执行指令,它的格式为:
G[=地址][断点地址1,断点地址2,…,断点地址10]
功能:
从指定地址处开始运行程序,直到遇到断点或者程序正常结束,然后停止执行,并显示当前所有寄存器和标志位的内容,以及下一条将要执行的指令,以便观察程序运行到此的情况。
如图所示:
由图可见,DEBUG调试程序调试的是可执行文件XIANSHI.EXE,键入U命令,DEBUG调试程序对可执行文件XIANSHI.EXE进行反汇编,键入G=00050009命令,从MOVAH,01H指令执行到CMPAL,00H为止(CMPAL,00H指令本身不执行),执行的结果是光标闪烁,提示输入一个字符(这段指令的功能就是从键盘输入一个字符,并回显,输入字符的ASCII码存入AL寄存器中),我们输入字符5,然后DEBUG调试程序显示当前所有寄存器和标志位的内容,以及下一条将要执行的指令;接着键入G0017命令,从当前的CS:
IP(0B5CH:
0009)开始运行一直到0017H这个断点,然后DEBUG调试程序显示当前所有寄存器和标志位的内容,以及下一条将要执行的指令。
可见,G命令等号后的地址指定程序段运行的起始地址,如不指定则从当前的CS:
IP开始运行。
断点地址如果只有偏移地址,则默认是代码段CS;断点可以没有,但最多只能有10个。
2.8跟踪命令T(Trace)
T命令也称为单步命令,它提供了一种逐条指令运行程序的方法,它的格式有两种:
(1)T[=地址]
功能:
从指定地址起执行一条指令后停下来,每条指令执行后都要显示所有寄存器和标志位的值以及下一条指令。
如未指定地址则从当前的CS:
IP开始执行,即逐条指令跟踪。
如图所示:
由图可见,在DEBUG调试程序的提示符下,键入A命令,汇编指令序列
MOVAX,1234H
MOVBX,5678H
ADDAX,BX
MOVCX,BX
SUBAX,CX
接着键入T=0100命令,执行0100H所在的一条指令MOVAX,1234H停下来,然后显示所有寄存器和标志位的值以及下一条指令;接着键入T命令,没有指定地址,于是就从当前的CS:
IP开始执行,执行一条指令MOVBX,5678H后停下来,并显示所有寄存器和标志位的值以及下一条指令;依次类推。
(2)T[=地址][数值]
功能:
从指定地址起执行数值参数指定条数的指令后停下来,每条指令执行后都要显示所有寄存器和标志位的值以及下一条指令。
如未指定地址则从当前的CS:
IP开始执行。
即多条指令跟踪。
如图所示:
由图可见,在DEBUG调试程序的提示符下,键入A命令,汇编指令序列
MOVAX,1234H
MOVBX,5678H
ADDAX,BX
MOVCX,BX
SUBAX,CX
接着键入T=01005命令,执行0100H开始的5条指令停下来,然后显示所有寄存器和标志位的值以及下一条指令。
T跟踪命令提供了一种逐条指令运行程序的方法,使程序员可以细致地观察程序每一步执行情况情况,因此它也成被称为单步命令。
T命令的另一个优点是在遇到循环指令(LOOP)、子程序(CALL)或中断调用(INTn)指令时,也会进入到子程序或中断服务程序当中执行,这一点和下面介绍的P命令有所不同。
2.9继续命令P(Proceed)
格式:
P[=地址][数值]
功能:
P命令类似T命令,只是不会进入循环指令、子程序或中断服务程序中。
当不需要调试循环指令、子程序或中断服务程序时,要应用P命令,而不是T命令。
如图4-22和图4-23所示:
由图4-22和图4-23可以看出P命令和T命令的区别。
2.10退出命令Q(Quit)
格式:
Q
功能:
Q命令使Debug程序退出,返回DOS。
Q命令并无存盘功能,可使用W命令存盘。
如图所示:
除此之外,DEBUG调试程序还有命名命令N(Name)、装入命令L(Load)、写盘命令W(Write)、比较命令C(Compare)、16进制数计算命令H(Hex)、输入命令I(Input)、输出命令O(Output)、传送命令M(Move)、查找命令S(Search)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- debug 调试
![提示](https://static.bingdoc.com/images/bang_tan.gif)