收藏 分享(赏)

DEBUG的主要用途及DEBUG的调用.doc

上传人:hskm5268 文档编号:5814015 上传时间:2019-03-18 格式:DOC 页数:41 大小:123.50KB
下载 相关 举报
DEBUG的主要用途及DEBUG的调用.doc_第1页
第1页 / 共41页
DEBUG的主要用途及DEBUG的调用.doc_第2页
第2页 / 共41页
DEBUG的主要用途及DEBUG的调用.doc_第3页
第3页 / 共41页
DEBUG的主要用途及DEBUG的调用.doc_第4页
第4页 / 共41页
DEBUG的主要用途及DEBUG的调用.doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、第一节 DEBUG 的主要用途及 DEBUG 的调用DEBUG 是为汇编语言设计的一种调试工具,它通过单步执行、设置断点等方式为汇编语言程序员提供了非常有效的程序调试手段。DEBUG 可以直接用来检查和修改内存单元、装入、存储及启动运行程序、检查及修改寄存器,也就是说 DEBUG 可深入到计算机的内部,可使用户更紧密地与计算机中真正进行的工作相联系。不仅如此,对汇编语言初学者来说,DEBUG 也是练习使用汇编指令的一种有效工具。初学者可以直接在 DEBUG 环境下执行汇编指令。然而,在 DEBUG 下运行汇编语言源程序也受到了一些限制,它不宜汇编较长的程序,不便于分块程序设计,不便于形成以 D

2、OS 外部命令形式构成的 .EXE 文件,不能使用浮动地址,也不能使用ASM 和 MASM 提供的绝大多数伪指令。在 DOS 系统中,DEBUG 是以 DOS 外部命令文件形式提供给用户的,名为 DEBUG.EXE。命令文件 DEBUG.EXE 一般存放在DOS 子目录下,因此调用 DEBUG 时,只需在 DOS 提示符下键入:DEBUG :. 例如: C:/DOSDEBUG DISKCOPY.COM A: B:进入 DEBUG 的提示符是符号“-”。即,出现提示符 “-”就表示可以接受 DEBUG 命令了。当进入 DEBUG 时,寄存器和标志设成以下数值,这些值用于DEBUG 调试中的程序。

3、段寄存器 CS,DS,ES 和 SS 均指向 DEBUG 末尾的第一个段。IP 寄存器置为 0100H。栈指针 SP 指向尾部或装入程序的暂存部分的底部。其余寄存器皆取零值,但若用户调用时含文件说明,则 CX 含文件长度(长度大于 64K 时 BX 含长度的高位);标志为各自的复位值;驱动器传送地址在代码段位移 80H 处。注意,若 DEBUG 装入扩展名为 .EXE 的文件,则 DEBUG 需重定位且设置段寄存器指示器为文件中所定义的值。但 DS,ES 指向最低可用段处的程序区前缀。BX 和 CX 为文件容量值。而 .EXE 文件如果在连接时选择了装入内存高处的参数,则该程序装入高处。第二节

4、 DEBUG 的主要命令功能与格式DEBUG 命令是在 DEBUG 提示符“- ”下,由键盘键入的。每条命令以单个字母的命令符开头,然后是命令的操作参数,操作参数与操作参数之间,用空格或逗号隔开,操作参数与命令符之间用空格隔开,命令的结束符是回车键 Enter。命令及参数的输入可以是大小写的结合。Ctrl+Break 键可中止命令的执行。Ctrl+Num Lock 键可暂停屏幕卷动,按任一键继续。所用数均为十六进制数,且不必写 H。* 1. 汇编命令 A格式:A : 上式等价于:(1) A :(2) A :(3) A (4) A功能:键入该命令后显示段地址和段内偏移并等待用户从键盘逐条键入汇编

5、命令,逐条汇编成代码指令,顺序存放到段地址和段内偏移所指定的内存区域,直到显示下一地址时用户直接键入回车键返回到提示符“- ”。注: 其中 (1)用指定段寄存器的内容作段地址,(3) 用 CS 的内容作段地址,(4)以 CS:100 作地址。以后命令中提及的各种地址 形式,均指(1)、(2)、(3)中 A 后的地址形式。2. 比较命令 C格式: C ,其中是由 或者是由 L 指出的一片连续单元。功能:从 的起始地址单元起逐个与目标起始地址以后的单元顺序比较单元的内容,直至源终止地址为止。遇有不一致时,以 的形式显示失配单元及内容。* 3. 显示内存命令 D格式: D 上式等价于:(1) D (

6、2) D (3) D功能:以两种形式显示指定范围的内存内容。一种形式为十六进制内容,一种形式为以相应字节的内容作为 ASCII 码的字符,对不可见字符以.代替。注: 其中 (1)以 CS 为段寄存器。(3)显示 CS:100 起始的一片内容。* 4. 修改内存命令 E格式: E 上式等价于:(1) E (2) E 其中是以逗号分隔的十六进制数,或用或” 括起来的字符串,或者是二者的组合。功能: (1)不断显示地址,可连续键入修改内容,直至新地址出现后键入回车 Enter 为止。(2)将逐一写入由开始的一片单元。5. 填充内存命令 F格式: F 功能: 将单元内容表中的值逐个填入指定范围,单元内

7、容表中内容用完后重复使用。例如: -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。逻辑扇区可由物理扇区号换算得到,以双面双密度盘为例:物理扇

8、区是按 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 扇区,逻辑扇区号为 08;物理扇区 1 面 0 道 1 扇区至 9 扇区,逻辑扇区号为 911H;物理扇区 0 面 1 道 1 扇区至 9 扇区,逻辑扇区号为 121AH;。这样每道先 0 面后 1 面一直排下去。其中为 0、1 或 2,0 表示 A 驱,1 表示 B 驱,2 表示硬盘。功能: 将指定的盘上,从起,共 n 个逻辑扇区上的所

9、有字节顺序读入指定内存地址开始的一片连续单元。当 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. 命名待读写文件命

10、令 N格式: N 功能: 为 LW 命令指定待装入写盘文件注: 其它形式参考 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零

11、 ZF 辅助AF奇偶PF进位CF状 态 有无 减增 开关 负正 零非 有无 偶奇 有无显 示 OVNVDNUPEIDI NGPLZRNZACNAPEPOCYNC(2)显示指定寄存器内容例如:-R AX -R F 15. 搜索指定内存命令 S格式: S 功能:在指定范围搜索表中内容,找到后显示表中元素所在地址例如:-S CS:100 110 41 显示:04BA:010404BA:010D表示在位移 100H 至 110H 间的上述两处有 41H。又如:-S C3:100 L 11 41“AB”E 表示在当前代码段位移 100H 至 111H 处寻找连续 4 个字节内容为41H、41H、42H

12、、0EH 的起始单元地址。* 16. 执行并显示系统环境命令 T格式:T = 功能:执行由指定地址起始的、由 指定的若干条命令。其中的缺省值是当前 IP 值, 的缺省值是一条。例如:-T 执行当前指令并显示状态-T 10 从当前指令始执行 10H 条指令* 17. 反汇编命令 U格式:U /上式等价于:(1) U (2) U (3) U功能:将指定范围内的代码以汇编语句形式显示,同时显示地址及代码。注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果。地址及范围的缺省值是上次 U 指令后下一地址的值。这样可以连续反汇编。* 18. 写盘命令 W格式:W 功能:与 L 命令不同的地方

13、是将内存从 起始的一片单元内容写入指定扇区。只有 W 而没有参数时,与 N 命令配合使用将文件写盘。注:要求读者对其中打“*“的 DEBUG 命令必须能熟练使用。第三节 在 DEBUG 环境下执行汇编指令本节从几个典型例子出发,通过上机实习,引导读者学会使用DEBUG 调试程序运行汇编语言程序,以便读者在以后的学习中能够有一个熟练的调试和运行手段。在进入 DEBUG 的提示符-之后,用户可以通过 DEBUG 的命令输入汇编源程序,并用相应命令将其汇编成机器语言程序;然后调试并运行该程序。例 1 在 DEBUG 下运行如下程序。MOV DL,33H ;字符 3 的 ASCII 码送 DLMOV

14、AH,2 ;使用 DOS 的 2 号功能调用INT 21H ;进入功能调用,输出 3INT 20H ;BIOS 中断服务程序,正常结束。该程序运行结果是在显示器上输出一个字符3。如果要输出其它字符,请改变程序中33H为相应字符的 ASCII 码。运行步骤:(1)进入 DEBUG设 DEBUG.EXE 位于 C 盘 DOS 子目录,进入 DOS 后键入DEBUG ,即C:/DOSDEBUG 屏幕显示: -号是进入 DEBUG 的提示符,在该提示符下可键入任意 DEBUG命令。现在用 A 命令送程序如下:(2)送程序并汇编-A 100 169C:0100 MOV DL,33 169C:0102 M

15、OV 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,33169C:0102 B402 MOV AH,02169C:0104 CD21 INT 21 169C:0106 CD20 INT 20169C:0108 - 右边是汇编指令,中间是该汇编指令的机器码,左边是存放该条指令的内存单元地址。

16、(4)运行程序-G 3Program 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 . . .

17、! . . a-(8)执行机器指令程序-G=200 3Program terminated normally-(9)退出 DEBUG 返回 DOS,执行 EXCOM.COM 文件-QC:/DOSEXCOM 3C:/DOS例 2 进入 DEBUG,用 A 命令送字节数据加法程序,用 R 命令显示状态,并用 T 命令单条执行(1)进入并用 A 命令写入汇编源程序C:/DOSDEBUG -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

18、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 NC1392:0100 B403 MOV AH,03-(3)用 G 命令执行,但看不到计算结果。-G Program terminated normally-(4)用 T 命令单条执行,可以看到中间结果。-TAX=0300 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1392

19、ES=1392 SS=1392 CS=1392 IP=0102 NV UP EI PL NZ NA PO NC1392:0102 B002 MOV AL,02-TAX=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-TAX=0305 BX=0000 CX=0000 DX=0000 SP=000

20、0 BP=0000 SI=0000 DI=0000DS=1392 ES=1392 SS=1392 CS=1392 IP=0106 NV UP EI PL NZ NA PO NC1392:0106 CD02 INT 20-TAX=0305 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1392 ES=1392 SS=1392 CS=011C IP=1094 NV UP DI PL NZ NA PO NC011C:1094 90 NOP-(6)退出-Q C:/DOS例 3 在 DEBUG 下运行下述程序,查看执行结果,并将其作为

21、可执行文件存入 A 盘。MOV AX,0FEH ;被乘数 0FEH 送 AXMOV CL,2 SHL AX,CL ;被乘数乘以 4,结果送 AXMOV BX,AX ;被乘数乘以 4 的结果送 BX 保留MOV CL,2 SHL AX,CL ;被乘数乘以 16,结果送 AX ADD AX,BX ;被乘数乘以 20,结果在 AX 中MOV 300H,AX ;将积存入 DS 段第 300H301H 号内存单元MOV AH,4CH ;将功能号 4CH 送 AHINT 21H ;执行 DOS 的 4CH 号功能调用,结束程序返回DOS。该程序运行结果是将 0FEH 乘以 14H,结果放在 DS 段第30

22、0H301H 号内存单元中。(1)进入 DEBUG,显示 300H 至 301H 号内存单元内容 C:/DOSDEBUG -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 300,AX 1392:0111 MOV AH,4C 1392:011

23、3 INT 21 1392:0116 -(3)用 G 命令执行到断点处(程序正常结束前) 停止-T=100,8 AX=13D8 BX=3F80 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1392 ES=1392 SS=1392 CS=1392 IP=0111 NV UP DI PL NZ NA PO NC1392:0111 B44C MOV AH,4C-(4)用 D 命令显示 300H 至 301H 的内容(最终结果)-D 300 301 1392:0300 D8 13 -(5)用 R 命令指定写盘文件长度-R BX BX 3F80:0

24、 -R CX CX 0000:16 -(6)用 N 命令命名写盘文件-N A:YWZCHF.COM (7)用 W 命令写盘-W -(8)用 Q 命令退出 DEBUG 环境,返回 DOS-Q C:/DOS(9)在 DOS 环境运行 YWZCHF.COMC:/DOSA:YWZCHF C:/DOS(10)将 YWZCHF.COM 装入内存运行C:/DOSDEBUG -N A:YWZCHF.COM -L -T=100,8 AX=13D8 BX=3F80 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1392 ES=1392 SS=1392 CS=1

25、392 IP=0111 NV UP DI PL NZ NA PO NC1392: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:/DOSdebug -A 169C:0100 MOV A

26、X,8A6D 169C:0103 ADD AX,0382 169C:0106 MOV 0200,AX 169C:0109 MOV AH,4C 169C:010B INT 21 169C:010D -R BX BX 0000: -R CX CX 0000:D -N A:JIAFA.COM -W -Q C:/DOSC:/DOSDEBUG -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=0000DS=1392 ES=1

27、392 SS=1392 CS=1392 IP=0109 NV UP DI PL NZ NA PO NC1392:0111 B4 4C MOV AH,4C-D 200 201 169C:0200 EF 8D -Q C:/DOS第四节 使用 DEBUG 调试和运行可执行文件事实上,在第三节例题中已经对使用 DEBUG 命令调试和运行可执行文件有所接触。本节只需对使用 DEBUG 调试和运行可执行文件的一般步骤做一介绍,并通过一个含有错误的程序来对程序调试进行实践。用户程序经过编辑、汇编、连接后得到一个可执行文件(.EXE),这时借助于调试程序 DEBUG 对用户程序进行调试,查看程序是否能完成预定

28、功能。对于初学者,如何选用 DEBUG 中各命令,有效地调试与运行程序,需要一个学习过程。在初次使用 DEBUG 时,可参照下列步骤进行。1调用 DEBUG,装入用户程序可以在调用 DEBUG 是直接装入用户程序可执行文件,也可以在进入 DEBUG 环境后使用 N 命令和 L 命令装入用户程序可执行文件。无论用哪种方法,装入用户程序可执行文件时,一定要指定文件全名(即文件名和扩展名)。2观察寄存器初始状态程序装入内存后,用 R 命令查看寄存器内容。从各段寄存器现在的内容,便能了解用户程序各逻辑段(代码段,堆栈段等)在内存的分布及其段基值。R 命令亦显示了各通用寄存器和标志寄存器的初始值,显示的

29、第三行就是即将执行的第一条指令。3以单步工作方式开始运行程序首先用 T 命令顺序执行用户程序的前几条指令,直到段寄存器DS 和或 ES 已预置为用户的数据段。在用 T 命令执行程序时,每执行一条指令,显示指令执行后寄存器的变化情况,以便用户查看指令执行结果。4观察用户程序数据段初始内容在第 3 步执行后 DS 和或 ES 已指向用户程序的数据段和附加段,这时用 D 命令可查看用户程序的原始数据。5继续以单步工作方式运行程序对于初学者,一般编写的程序比较短,用 T 命令逐条执行指令,可清楚地了解程序的执行过程:现在执行的是什么指令,执行后的结果在哪里(寄存器,存储单元)?所得结果是否正确?等等。

30、在逐次使用 T 命令时,若有需要,可选用 D 命令了解某些内存单元的变化情况。用 T 命令逐条执行程序时,如遇上用户程序中的软中断指令INT(如 INT 21H),这时,通常不要用单步工作方式执行 INT 指令。因为系统提供的软中断指令 INT 是以中断处理子程序形式实现功能调用,且这种处理子程序常常是较长的。若用 T 命令去执行INT 指令,那么将跳转到相应的功能调用于程序中,要退出该子程序需要化费较多时间。如果既要执行 INT 指令,又要跳过这段功能调用子程序,则应使用连续工作方式(G 命令),且设置断点,其断点应为 INT 指令的下一条指令。例如要以单步工作方式执行下面一段程序:10B0:0022 MOV DX,001010B0:0026 MOV AH,0910B0:0028 INT 2110B0:002A MOV CX,00当用 T 命令完成“MOV AH,09”指令后,应使用 G 命令:-G 002A 这样,以连续工作方式实现功能调用后,即暂停在偏移量为002A 的“MOV CX,00” 指令处(未执行),如同用单步工作方式完成 INT 指令的执行一样。6连续工作方式运行程序在用单步工作方式运行程序后,可再用连续工作方式从头开始运行程序,查看运行结果。在用 G 命令时,注意指定运行程序的起始

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报