还剩39页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第一节DEBUG的主要用途及DEBUG的调用 DEBUG是为汇编语言设计的一种调试工具,它通过单步执行、设置断点等方式为汇编语言程序员提供了非常有效的程序调试手段DEBUG可以直接用来检查和修改内存单元、装入、存储及启动运行程序、检查及修改寄存器,也就是说DEBUG可深入到计算机的内部,可使用户更紧密地与计算机中真正进行的工作相__不仅如此,对汇编语言初学者来说,DEBUG也是练习使用汇编指令的一种有效工具初学者可以直接在DEBUG环境下执行汇编指令然而,在DEBUG下运行汇编语言源程序也受到了一些限制,它不宜汇编较长的程序,不便于分块程序设计,不便于形成以DOS外部命令形式构成的.EXE文件,不能使用浮动地址,也不能使用A__和____提供的绝大多数伪指令 在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[[段寄存器名/段地址:]段内偏移] 上式等价于: 1A段寄存器名:段内偏移 2A段地址:段内偏移 3A段内偏移 4A功能键入该命令后显示段地址和段内偏移并等待用户从键盘逐条键入汇编命令,逐条汇编成代码指令,顺序存放到段地址和段内偏移所指定的内存区域,直到显示下一地址时用户直接键入回车键返回到提示符“-”注:其中1用指定段寄存器的内容作段地址,3用CS的内容作段地址,4以CS:100作地址以后命令中提及的各种‘地址’形式,均指
1、
2、3中A后的地址形式
2.比较命令C格式:C源地址范围,目标地址 其中范围是由起始地址终止地址或者是由起始地址L长度指出的一片连续单元功能从源地址范围的起始地址单元起逐个与目标起始地址以后的单元顺序比较单元的内容,直至源终止地址为止遇有不一致时,以源地址源内容目标内容目标地址的形式显示失配单元及内容*
3.显示内存命令D格式:D[地址/范围] 上式等价于: 1D地址 2D范围 3D功能以两种形式显示指定范围的内存内容一种形式为十六进制内容,一种形式为以相应字节的内容作为ASCII码的字符,对不可见字符以‘.’代替注:其中1以CS为段寄存器3显示CS:100起始的一片内容 *
4.修改内存命令E格式:E地址[单元内容表] 上式等价于: 1E地址 2E地址单元内容表 其中单元内容表是以逗号分隔的十六进制数,或用’或”括起来的字符串,或者是二者的组合功能:1不断显示地址,可连续键入修改内容,直至新地址出现后键入回车Enter为止2将单元内容表逐一写入由地址开始的一片单元
5.填充内存命令F格式:F范围单元内容表功能:将单元内容表中的值逐个填入指定范围,单元内容表中内容用完后重复使用 例如:-F5BC:200L10B2,‘XYZ’,3CEnter*
6.执行命令G格式:G[=地址[,断点]] 上式等价于: 1G 2G=地址 3G=地址,断点功能:执行内存中的指令序列注: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[寄存器名] 上式等价于: 1R 2R寄存器名功能:1显示当前所有寄存器内容,状态标志及将要执行的下一指令的地址,代码及汇编语句形式其中对状态标志FLAG以每位的形式显示,详见表5-1表5-1状态标志显示形式标志位溢出OF方向DF中断IF符号SF零__辅助AF奇偶PF进位CF状 态有/无减/增开/关负/正零/非有/无偶/奇有/无显 示OV/NVDN/UPEI/DING/PLZR/NZAC/NAPE/POCY/NC 2显示指定寄存器内容例如-RAXEnter -RFEnter
15.搜索指定内存命令S格式:S地址范围表功能在指定范围搜索表中内容,找到后显示表中元素所在地址 例如-SCS:10011041Enter 显示04BA:0104 04BA:010D 表示在位移100H至110H间的上述两处有41H又如 -SC3:100L1141“AB”E Enter表示在当前代码段位移100H至111H处寻找连续4个字节内容为41H、41H、42H、0EH的起始单元地址*
16.执行并显示系统环境命令T格式T[=地址][条数]功能执行由指定地址起始的、由条数指定的若干条命令其中地址的缺省值是当前IP值,条数的缺省值是一条 例如-TEnter 执行当前指令并显示状态 -T10Enter 从当前指令始执行10H条指令*
17.反汇编命令U格式U[地址/地址范围] 上式等价于: 1U 地址 2U 地址范围 3U功能将指定范围内的代码以汇编语句形式显示,同时显示地址及代码注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果地址及范围的缺省值是上次U指令后下一地址的值这样可以连续反汇编*
18.写盘命令W格式W地址盘号起始逻辑扇区所写逻辑扇区数n功能与L命令不同的地方是将内存从地址起始的一片单元内容写入指定扇区只有W而没有参数时,与N命令配合使用将文件写盘注要求读者对其中打*的DEBUG命令必须能熟练使用 第三节在DEBUG环境下执行汇编指令 本节从几个典型例子出发,通过上机实习,引导读者学会使用DEBUG调试程序运行汇编语言程序,以便读者在以后的学习中能够有一个熟练的调试和运行手段 在进入DEBUG的提示符‘-’之后,用户可以通过DEBUG的命令输入汇编源程序,并用相应命令将其汇编成机器语言程序;然后调试并运行该程序例1在DEBUG下运行如下程序 MOVDL,33H ;字符3的ASCII码送DL MOVAH,2 ;使用DOS的2号功能调用 INT21H ;进入功能调用,输出‘3’ INT20H ;BIOS中断服务程序正常结束 该程序运行结果是在显示器上输出一个字符‘3’如果要输出其它字符,请改变程序中‘33H’为相应字符的ASCII码运行步骤1进入DEBUG 设DEBUG.EXE位于C盘DOS子目录,进入DOS后键入DEBUGEnter,即 C:/DOSDEBUGEnter 屏幕显示:- ‘-’号是进入DEBUG的提示符,在该提示符下可键入任意DEBUG命令现在用A命令送程序如下:2送程序并汇编 -A100Enter 169C:0100MOVDL,33Enter 169C:0102MOVAH,2Enter 169C:0104INT21Enter 169C:0106INT20Enter 169C:0108Enter -Enter至此程序已送完,汇编成机器指令顺序存放于CS段100H起始的8个存储单元 如果在汇编后想看一下机器指令是什么样子的话,方法之一是可以用反汇编命令U作如下操作3反汇编 -U100108Enter 169C:0100 B233 MOVDL,33 169C:0102 B402 MOVAH,02 169C:0104 CD21 INT21 169C:0106 CD20 INT20 169C:0108-右边是汇编指令,中间是该汇编指令的机器码,左边是存放该条指令的内存单元地址4运行程序 -GEnter 3 Programterminatednor__lly -5写COM文件 -RBXEnter BX0000 :Enter -RCXEnter CX0000 :AEnter -NEXCOM.COMEnter -WEnter - 其中BX*_____H+CX用于指定所写的字节数,BX为该数的高16位,CX为该数的低16位因此,上面的过程实际上是要将A个字节写入文件EXCOM.COM6送机器指令程序 -E200B233B402CD21CD20Enter -7显示内存 -D200208Enter169C:0200 B233B402CD21CD20-61 .
3...!..a-8执行机器指令程序 -G=200Enter 3 Programterminatednor__lly -9退出DEBUG返回DOS,执行EXCOM.COM文件 -Q C:/DOSEXCOMEnter 3 C:/DOS例2进入DEBUG,用A命令送字节数据加法程序,用R命令显示状态,并用T命令单条执行1进入并用A命令写入汇编源程序C:/DOSDEBUGEnter-AEnter1392:0100 MOVAH,3Enter1392:0102 MOVAL,2Enter1392:0104 ADDAL,AHEnter1392:0106 INT20Enter1392:0108Enter-2用R命令显示寄存器状态-REnterAX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1392 ES=1392 SS=1392 CS=1392 IP=0100 NV UP EI PL NZ NA PO NC1392:0100 B403 MOVAH,03-3用G命令执行,但看不到计算结果-GEnterProgram terminated nor__lly-4用T命令单条执行,可以看到中间结果-TAX=0300 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1392 ES=1392 SS=1392 CS=1392 IP=0102 NV UP EI PL NZ NA PO NC1392:0102 B002 MOVAL,02-TAX=0302 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1392 ES=1392 SS=1392 CS=1392 IP=0104 NV UP EI PL NZ NA PO NC 1392:0104 00E0 ADDAL,AH5再执行T命令,可以看到最终结果,AL=5-TAX=0305 BX=0000 CX=0000 DX=0000 SP=0000 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 INT20-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退出-QEnterC:/DOS例3在DEBUG下运行下述程序,查看执行结果,并将其作为可执行文件存入A盘 MOVAX,0FEH ;被乘数0FEH送AX MOVCL,2 SHLAX,CL ;被乘数乘以4,结果送AX MOVBX,AX ;被乘数乘以4的结果送BX保留 MOVCL,2 SHLAX,CL ;被乘数乘以16,结果送AX ADDAX,BX ;被乘数乘以20,结果在AX中 MOV[300H],AX ;将积存入DS段第300H—301H号内存单元 MOVAH,4CH ;将功能号4CH送AH INT21H ;执行DOS的4CH号功能调用,结束程序返回DOS 该程序运行结果是将0FEH乘以14H,结果放在DS段第300H—301H号内存单元中1进入DEBUG,显示300H至301H号内存单元内容 C:/DOSDEBUGEnter-D300301Enter1392:03000000 ..-2用A命令装入程序段并汇编-AEnter1392:0100 MOVAX,0FEEnter1392:0102 MOVCL,2Enter1392:0104 SHLAX,CLEnter1392:0106 MOVBX,AXEnter1392:0108 MOVCL,2 Enter1392:010A SHLAX,CLEnter1392:010C ADDAX,BXEnter1392:010E MOV
[300],AXEnter1392:0111 MOVAH,4CEnter1392:0113 INT21Enter1392:0116Enter-3用G命令执行到断点处程序正常结束前停止-T=100,8EnterAX=13D8 BX=3F80 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1392 ES=1392 SS=1392 CS=1392 IP=0111 NVUPDIPLNZNAPONC1392:0111B44C MOVAH,4C-4用D命令显示300H至301H的内容最终结果-D300301Enter1392:0300 D813 ..-5用R命令指定写盘文件长度-RBXEnterBX3F80:0Enter-RCXEnterCX0000:16Enter-6用N命令命名写盘文件-NA:YWZCHF.COMEnter7用W命令写盘-WEnter-8用Q命令退出DEBUG环境,返回DOS-QEnterC:/DOS9在DOS环境运行YWZCHF.COMC:/DOSA:YWZCHFEnterC:/DOS10将YWZCHF.COM装入内存运行C:/DOSDEBUGEnter-NA:YWZCHF.COMEnter-LEnter-T=100,8EnterAX=13D8 BX=3F80 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1392 ES=1392 SS=1392 CS=1392 IP=0111 NVUPDIPLNZNAPONC1392:0111B44C MOVAH,4C -D300301Enter1392:0300 D813 ..11用Q命令退出DEBUG环境,返回DOS-QEnterC:/DOS例4在DEBUG环境下,送入一个加法源程序并汇编成可执行代码;将其作为可执行文件JIAFA.COM存储到A盘;在DOS命令行执行可执行文件JIAFA.COM;进入DEBUG,将可执行文件JIAFA.COM装入内存CS:100H处运行,并用T命令查看运算结果C:/DOSdebugEnter-AEnter169C:0100MOVAX,8A6DEnter169C:0103ADDAX,0382Enter169C:0106MOV
[0200],AXEnter169C:0109MOVAH,4CEnter169C:010BINT21Enter169C:010DEnter-RBXEnterBX0000:Enter-RCXEnterCX0000:DEnter-NA:JIAFA.COMEnter-WEnter-QEnterC:/DOSC:/DOSDEBUGEnter-NA:JIAFA.COMEnter-LEnter-GEnterProgramterminatednor__lly-T=100,3EnterAX=8DEF BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1392 ES=1392 SS=1392 CS=1392 IP=0109 NV UP DI PL NZ NA PO NC1392:0111B44C MOVAH,4C-D200201Enter169C:0200EF8D ..-QEnterC:/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(如INT21H),这时,通常不要用单步工作方式执行INT指令因为系统提供的软中断指令INT是以中断处理子程序形式实现功能调用,且这种处理子程序常常是较长的若用T命令去执行INT指令,那么将跳转到相应的功能调用于程序中,要退出该子程序需要化费较多时间如果既要执行INT指令,又要跳过这段功能调用子程序,则应使用连续工作方式(G命令),且设置断点,其断点应为INT指令的下一条指令例如要以单步工作方式执行下面一段程序 10B00022 MOV DX,0010 10B00026 MOV AH,09 10B00028 INT 21 10B0002A MOV CX,00 当用T命令完成“MOV AH,09”指令后,应使用G命令 -G 002AEnter 这样,以连续工作方式实现功能调用后,即暂停在偏移量为002A的“MOVCX,00”指令处(未执行),如同用单步工作方式完成INT指令的执行一样6.连续工作方式运行程序 在用单步工作方式运行程序后,可再用连续工作方式从头开始运行程序,查看运行结果在用G命令时,注意指定运行程序的起始地址若G命令中未指定起始地址,就隐含为从当前CS:IP指向的指令开始7.修改程序和数据 经过上面几步后,若发现程序有错,则需要适当进行修改这时,如果仅需作个别修改,可在DEBUG状态下,使用A命令这种修改仅仅是临时修改内存中的可执行文件,未涉及源程序当确认修改正确后,应返回至编辑程序,修改源程序,然后再汇编、连接 为了确认用户程序的正确性,常常需用几组不同的原始数据去运行程序,查看是否都能获得正确结果这时,可用E命令在用户程序的数据段和附加段中修改原始数据,然后再用T命令或G命令运行程序,查看运行结果,直到各组数据都能获得正确结果为止8.运用断点调试程序 如果已确认程序是正确的,在连续工作方式下,可快速地运行程序;如果已知程序运行结果不正确,用G命令运行程序,中途不停,很难查找错误改用T命令,虽然可以随意暂停程序的执行,但是运行速度慢,如果运用断点,可快速查找错误这里的“断点”是程序连续运行时要求暂停的指令位置(地址),用要求暂停的一条指令首字节地址表示当程序连续运行到这断点地址时,程序就暂停,并显示现在各寄存器内容和下面将要执行的指令(即断点处指令)为了准确设置断点,可用反汇编命令U察看源程序运用断点,可以很快地查找出错误发生在哪一个程序段内,缩小查找错误的范围然后在预计出错的范围内,再用T命令仔细观察程序运行情况,确定出错原因和位置,完成程序的调试例5现有一个双字加法源程序如下,其中存在错误现假设已汇编、连结生成了可执行文件SZJiaFa.EXE,存放在C:/DOS目录下请使用DEBUG对其进行调试CodeSEGMENT ASSUMECS:codeDS:code ORG100H ;从100H处开始存放下列指令Start:MOVAXcode ;将DS置成code段的首地址 MOVDSAX MOVSI200H ;取第一个数的首地址 MOVAX[SI] ;将第一个数的低16位取到AX MOVDI204H ;取第二个数的首地址 ADDAX[DI] ;第一个数和第二个数的低16应相加 MOV[SI+8]AX ;低16位相加的结果送到208H和209H单元 MOVAX[SI+2] ;取第一个数的高16位送到AX中 ADDAX[DI+2] ;两个数的高16位相加 MOV[SI+0AH]AX ;高16位相加的结果送到20AH,20BH单元 MOVAX4C00H ;使用DOS的4CH号功能调用 INT21H ;进入功能调用,返回DOS ORG200H ;从200H处开始存放下列数据 DD12345678h654387A9h0h;被加数、加数、和CodeENDS ENDstart调试过程1进入DEBUG并装入可执行文件SZJiaFa.EXEC:/DOSDEBUGSZJiaFa.EXEEnter-2观察寄存器初始状态-REnterAX=0000 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1__2 ES=1__2 SS=18A2 CS=18A2 IP=0100 NVUPEIPLNZNAPONC18A2:0100B8A218 MOV AX18A23以单步工作方式开始运行程序 首先用T命令顺序执行用户程序的前l两条指令,将段寄存器DS预置为用户的数据段-TEnterAX=18A2 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1__2 ES=1__2 SS=18A2 CS=18A2 IP=0103 NVUPEIPLNZNAPONC18A2:01038ED8 MOV DSAX-TEnterAX=18A2 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=18A2 ES=1__2 SS=18A2 CS=18A2 IP=0105 NVUPEIPLNZNAPONC18A2:0105BE0002 MOV SI02004观察用户程序数据段初始内容-D20020FEnter18A2:0200 78563412A9874365-0000000000741350 xV
4...__.....t.P-5连续工作方式运行程序至返回DOS前(设断点),查看运行结果为此,现使用U命令反汇编 -U100Enter 18A2:0100B8A218 MOV AX18A2 18A2:01038ED8 MOV DSAX 18A2:0105BE0002 MOV SI0200 18A2:01088B04 MOV AX[SI] 18A2:010ABF0402 MOV DI0204 18A2:010D0305 ADD AX[DI] 18A2:010F__4408 MOV [SI+08]AX 18A2:01128B4402 MOV AX[SI+02] 18A2:0115034502 ADD AX[DI+02] 18A2:011889440A MOV [SI+0A]AX 18A2:011BB8004C MOV AX4C00 18A2:011ECD21 INT 21 -可见,要执行10条指令,至011B处停止-G=100011BEnter AX=7777 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204 DS=18A2 ES=1__2 SS=18A2 CS=18A2 IP=011B NVUPEIPLNZNAPENC 18A2:011BB8004C MOV AX4C00 -D20020FEnter 18A2:0200 78563412A9874365-21DE777743438306 xV
4...__!.wwCC.. -和为7777DE21H,正确6再取一组数据,查看运行结果为此,首先用E命令修改数据 -E200CDAB785690EF3412Enter -D20020FEnter 18A2:0200 CDAB785690EF3412-21DE777743438306 ..xV..
4.!.wwCC.. -G=10011BEnter AX=68AC BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204 DS=18A2 ES=1__2 SS=18A2 CS=18A2 IP=011B NVUPEIPLNZNAPENC 18A2:011BB8004C MOV AX4C00 -D20020FEnter 18A2:0200 CDAB785690EF3412-5D9BAC6843438306 ..xV..
4.]..hCC.. -和为68AC9B5DH,错误说明程序有问题7再将断点设在完成低位字加法后,查看运行结果-G=100112Enter AX=9B5D BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204 DS=18A2 ES=1__2 SS=18A2 CS=18A2 IP=0112 NVUPEINGNZNAPOCY 18A2:01128B4402 MOV AX[SI+02] DS:0202=5678 -D20020FEnter 18A2:0200 CDAB785690EF3412-5D9BAC6843438306 ..xV..
4.]..hCC.. -低位和为9B5D,正确说明错误可能出在后面8使用T命令从刚才的断点处向后单步调试,查看运行结果-T=112Enter AX=5678 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204 DS=18A2 ES=1__2 SS=18A2 CS=18A2 IP=0115 NVUPEINGNZNAPOCY 18A2:0115034502 ADD AX[DI+02] DS:0206=1234 -TEnterAX=68AC BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204 DS=18A2 ES=1__2 SS=18A2 CS=18A2 IP=0118 NVUPEIPLNZNAPENC 18A2:011889440A MOV [SI+0A]AX DS:020A=68AC -AX寄存器的结果为68AC,而应为68AD可见是本条加法指令使用错误,这里应使用带进位加法指令9使用A命令装入正确指令后再次运行,察看结果-A115Enter 18A2:0115ADCAX[DI+02]Enter 18A2:0118Enter -G=10011BEnter AX=68AD BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204 DS=18A2 ES=1__2 SS=18A2 CS=18A2 IP=011B NVUPEIPLNZNAPONC 18A2:011BB8004C MOV AX4C00 -D20020FEnter 18A2:0200 CDAB785690EF3412-5D9BAD6843438306 ..xV..
4.]..hCC.. -和为68AD9B5DH,正确对于这样一个简单程序一般来说不会再有问题退出后修改源程序即可10退出-QEnterC:/DOS需要说明的是此程序很简单,只需使用T命令逐条单步调试即可本例采用的调试方法似乎过于繁琐,但这是为了说明程序调试的一般方法,以便读者调试复杂程序时借鉴。