第一节 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 <Enter>
* 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 <Enter>
-L <Enter>
将当前驱动器上的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 <Enter>
将4FH从端口2FH输出
* 13. 结束DEBUG返回DOS命令Q
格式:Q
功能:返回DOS提示符下
* 14. 显示修改寄存器命令R
格式: R [<寄存器名>]
上式等价于:
(1) R
(2) R <寄存器名>
功能: (1)显示当前所有寄存器内容,状态标志及将要执行的下一