常用DEBUG命令的功能及使用举例第一节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:\DOSDEBUGDISKCOPY.COMA: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+NumLock键可暂停屏幕卷动,按任一键继续。所用数均为十六进制数,且不必写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范围单元内容表功能:将单元内容表中的值逐个填入指定范围,单元内容表中内容用完后重复使用。例如:-F5BC:200L10B2,‘XYZ’,3CEnter*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执行后将该文件装入内存。例如:-NEXAMPLEEnter-LEnter将当前驱动器上的EXAMPLE文件装入CS:100起始的一片内存单元。10.内存搬家命令M格式:M源地址范围目标起始地址其中源及目标地址若仅输入偏移量,则隐含相对DS。功能:把源地址范围中的内容顺序搬至目标起始地址起的一片连续单元。例如:-MCS:100110600把从CS:100起至CS:110止17个字节搬至DS:600至DS:610的一片单元。*11.命名待读/写文件命令N格式:N文件名说明功能:为L/W命令指定待装入/写盘文件注:其它形式参考DOS手册12.端口输出命令O格式:O端口地址字节功能:将该字节从指定端口地址输出。例如:-O2F4FEnter将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/NVDN/UPEI/DING/PLZR/NZAC/NAPE/POCY/NC(2)显示指定寄存器内容例如:-RAXEnter-RFEnter15.搜索指定内存命令S格式:S地址范围表功能:在指定范围搜索表中内容,找到后显示表中元素所在地址例如:-SCS:10011041Enter显示:04BA:010404BA:010D表示在位移100H至110H间的上述两处有41H。又如:-SC3:100L1141“AB”EEnter表示在当前代码段位移100H至111H处寻找连续4个字节内容为41H、41H、42H、0EH的起始单元地址。*16.执行并显示系统环境命令T格式:T[=地址][条数]功能:执行由指定地址起始的、由条数指定的若干条命令。其中地址的缺省值是当前IP值,条数的缺省值是一条。例如:-TEnter执行当前指令并显示状态-T10Enter从当前指令始执行10H条指令*17.反汇编命令U格式:U[地址/地址范围]上式等价于:(1)U地址(2)U地址范围(3)U功能:将指定范围内的代码以汇编语句形式显示,同时显示地址及代码。注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果。地址及范围的缺省值是上次U指令后下一地址的值。这样可以连续反汇编。*18.写盘命令W格式:W地址盘号起始逻辑扇区所写逻辑扇区数n功能:与L命令不同的地方是将内存从地址起始的一片单元内容写入指定扇区。只有W而没有参数时,与N命令配合使用将文件写盘。注:要求读者对其中打*的DEBUG命令必须能熟练使用。第三节在DEBUG环境下执行汇编指令本节从几个典型例子出发,通过上机实习,引导读者学会使用DEBUG调试程序运行汇编语言程序,以便读者在以后的学习中能够有一个熟练的调试和运行手段。在进入DEBUG的提示符‘-’之后,用户可以通过DEBUG的命令输入汇编源程序,并用相应命令将其汇编成机器语言程序;然后调试并运行该程序。例1在DEBUG下运行如下程序。MOVDL,33H;字符3的ASCII码送DLMOVAH,2;使用DOS的2号功能调用INT21H;进入功能调用,输出‘3’INT20H;BIOS中断服务程序,正常结束。该程序运行结果是在显示器上输出一个字符‘3’。如果要输出其它字符,请改变程序中‘33H’为相应字符的ASCII码。运行步骤:(1)进入DEBUG设DEBUG.EXE位于C盘DOS子目录,进入DOS后键入DEBUGEnter,即C:\DOSDEBUGEnter屏幕显示:-‘-’号是进入DEBUG的提示符,在该提示符下可键入任意DEBUG命令。现在用A命令送程序如下:(2)送程序并汇编-A100Enter169C:0100MOVDL,33Enter169C:0102MOVAH,2Enter169C:0104INT21Enter169C:0106INT20Enter169C:0108Enter-Enter至此程序已送完,汇编成机器指令,顺序存放于CS段100H起始的8个存储单元。如果在汇编后想看一下机器指令是什么样子的话,方法之一是可以用反汇编命令U作如下操作:(3)反汇编-U100108Enter169C:0100B233MOVDL,33169C:0102B402MOVAH,02169C:0104CD21INT21169C:0106CD20INT20169C:0108-右边是汇编指令,中间是该汇编指令的机器码,左边是存放该条指令的内存单元地址。(4)运行程序-GEnter3Programterminatednormally-(5)写COM文件-RBXEnterBX0000:Enter-RCXEnterCX0000:AEnter-NEXCOM.COMEnter-WEnter-其中(BX)*10000H+(CX)用于指定所写的字节数,(BX)为该数的高16位,(CX)为该数的低16位。因此,上面的过程实际上是要将A个字节写入文件EXCOM.COM。(6)送机器指令程序-E200B233B402CD21CD20Enter-(7)显示内存-D200208Enter169C:0200B233B402CD21CD20-61.3...!..a-(8)执行机器