Debug启动Debug,它是可用于测试和调试MS-DOS可执行文件的程序。Debug[[drive:][path]filename[parameters]]参数[drive:][path]filename指定要测试的可执行文件的位置和名称。parameters指定要测试的可执行文件所需要的任何命令行信息。++说明使用Debug命令但不指定要测试的文件如果使用没有位置和文件名的Debug命令,然后键入所有的Debug命令以响应Debug提示符,连字符(-)。Debug命令以下是Debug命令列表:?显示Debug命令列表。a汇编8086/8087/8088记忆码。c比较内存的两个部分。d显示部分内存的内容。e从指定地址开始,将数据输入到内存。f使用指定值填充一段内存。g运行在内存中的可执行文件。h执行十六进制运算。i显示来自特定端口的1字节值。l将文件或磁盘扇区内容加载到内存。m复制内存块中的内容/n为l或w命令指定文件,或者指定正在测试的文件的参数。o向输出端口发送1个字节的值。p执行循环、重复的字符串指令、软件中断或子例程。q停止Debug会话。r显示或改变一个或多个寄存器。s在部分内存中搜索一个或多个字节值的模式。t执行一条指令,然后显示所有寄存器的内容、所有标志的状态和Debug下一步要执行的指令的解码形式。u反汇编字节并显示相应的原语句。w将被测试文件写入磁盘。xa分配扩展内存。xd释放扩展内存。xm映射扩展内存页。xs显示扩展内存的状态。分隔命令参数所有Debug命令都接受参数,除了q命令之外。可以用逗号或空格分隔参数,但是只有在两个十六进制值之间才需要这些分隔符。因此,以下命令等价:dcs:100110dcs:100110d,cs:100,110指定有效地址项Debug命令中的address参数指定内存位置。Address是一个包含字母段记录的二位名称或一个四位字段地址加上一个偏移量。可以忽略段寄存器或段地址。a,g,l,t,u和w命令的默认段是CS。所有其他命令的默认段是DS。所有数值均为十六进制格式。有效地址如下:CS:010004BA:0100在段名和偏移量之间要有冒号。指定有效范围项Debug命令中的range参数指定了内存的范围。可以为range选择两种格式:起始地址和结束地址,或者起始地址和长度范围(由l表示)。例如,下面的两个语法都可以指定从CS:100开始的16字节范围:cs:10010fcs:100l10++Debug子命令选择Debug命令以获得详细信息。Debug:A(汇编)Debug:C(比较)Debug(转储)Debug:E(键入)Debug:F(填充)Debug:G(转向)Debug:H(十六进制)Debug:I(输入)Debug:L(加载)Debug:M(移动)Debug:N(名称)Debug:O(输出)Debug:P(执行)Debug:Q(退出)Debug:r(寄存器)Debug:s(搜索)Debug:T(跟踪)Debug:U(反汇编)Debug:W(写入)Debug:XA(分配扩展内存)Debug:XD(取消分配扩展内存)Debug:XM(映射扩展内存页)Debug:XS(显示扩展内存状态)***********************Debug子命令******************************Debug:A(汇编)直接将8086/8087/8088记忆码合并到内存。该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆码。a[address]参数address指定键入汇编语言指令的位置。对address使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a将在它上次停止处开始汇编。有关将数据输入到指定字节中的信息,请单击“相关主题”列表中的DebugE(键入)。有关反汇编字节的信息,请单击“相关主题”列表中的DebugU(反汇编)。范例a命令支持所有形式的间接注册命令,如下例所示:addbx,34[bp+2].[si-1]pop[bp+di]push[si])还支持所有操作码同义词,如下例所示:loopz100loope100ja200jnbe200对于8087操作码,必须指定wait或fwait前缀,如下例所示:fwaitfaddst,st(3);thislineassembles;anfwaitprefix说明使用记忆码段的替代记忆码为cs:、ds:、es:和ss:。远程返回的记忆码是retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用movsw可以移动16位的字串,使用mov***(文字因故被系统屏蔽)***(文字因故被系统屏蔽)可以移动8位字节串。汇编跳转和调用汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用near或far前缀可以替代这样的跳转或调用,如下例所示:-a0100:05000100:0500jmp502;a2-byteshortjump0100:0502jmpnear505;a3-bytenearjump0100:0505jmpfar50a;a5-bytefarjump可以将near前缀缩写为ne。区分字和字节内存位置当某个操作数可以引用某个字内存位置或者字节内存位置时,必须用前缀wordptr或者前缀byteptr指定数据类型。可接受的缩写分别是wo和by。以下范例显示两种格式:decwo[si]negbyteptr[128]指定操作数Debug使用包括在中括号([])的操作数引用内存地址的习惯用法。这是因为另一方面Debug不能区分立即操作数和内存地址的操作数。以下范例显示两种格式:movax,21;loadAXwith21hmovax,[21];loadAXwiththe;contentsof;memorylocation21h使用伪指令使用a命令提供两个常用的伪指令:db操作码,将字节值直接汇编到内存,dw操作码,将字值直接汇编到内存。以下是两个伪指令的范例:db1,2,3,4,THISISANEXAMPLEdbTHISISAQUOTATIONMARK:dbTHISISAQUOTATIONMARK:dw1000,2000,3000,BACH++Debug:C(比较)比较内存的两个部分。crangeaddress参数range指定要比较的内存第一个区域的起始和结束地址,或起始地址和长度。有关有效的range值的信息,请单击“相关主题”列表中的“Debug说明”。address指定要比较的第二个内存区域的起始地址。有关有效address值的信息,请单击“相关主题”列表中的“Debug说明”。++范例以下命令具有相同效果:c100,10f300c100l10300每个命令都对100h到10Fh的内存数据块与300h到30Fh的内存数据块进行比较。Debug响应前面的命令并显示如下信息(假定DS=197F):197F:01004DE4197F:0300197F:01016799197F:0301197F:0102A327197F:0302197F:010335F3197F:0303197F:010497BD197F:0304197F:01050435197F:0305197F:01077671197F:0307197F:0108E611197F:0308197F:0109192C197F:0309197F:010A800A197F:030A197F:010B367F197F:030B197F:010CBE22197F:030C197F:010D8393197F:030D197F:010E4977197F:030E197F:010F4F8A197F:030F注意列表中缺少地址197F:0106和197F:0306。这表明那些地址中的值是相同的。++说明如果range和address内存区域相同,Debug将不显示任何内容而直接返回到Debug提示符。如果有差异,Debug将按如下格式显示:address1byte1byte2addess2++++Debug(转储)显示一定范围内存地址的内容。d[range]参数range指定要显示其内容的内存区域的起始和结束地址,或起始地址和长度。有关有效的range值的信息,请单击“相关主题”列表中的“Debug说明”。如果不指定range,Debug程序将从以前d命令中所指定的地址范围的末尾开始显示128个字节的内容。有关显示寄存器内容的信息,请单击“相关主题”列表中的DebugR(寄存器)。++范例假定键入以下命令:dcs:10010fDebug按以下格式显示范围中的内容:04BA:0100544F4D0053415759-4552000000000000TOM.SAWYER......如果在没有参数的情况下键入d命令,Debug按以前范例中所描述的内容来编排显示格式。显示的每行以比前一行的地址大16个字节(如果是显示40列的屏幕,则为8个字节)的地址开头。对于后面键入的每个不带参数的d命令,Debug将紧接在最后显示的命令后立即显示字节内容。如果键入以下命令,Debug将从CS:100开始显示20h个字节的内容:dcs:100l20如果键入以下命令,Debug将显示范围从CS段的100h到115h中所有字节的内容:dcs:100115++说明当使用d命令时,Debug以两个部分显示内存内容:十六进制部分(每个字节的值都用十六进制格式表示)和ASCII码部分(每个字节的值都用ASCII码字符表示)。每个非打印字符在显示的ASCII部分由句号(.)表示。每个显示行显示16字节的内容,第8字节和第9字节之间有一个连字符。每个显示行从16字节的边界上开始。++Debug:E(键入)将数据输入到内存中指定的地址。可以按十六进制或ASCII格式键入数据。以前存储在指定位置的任何数据全部丢失。eaddress参数address指定输入数据的第一个内存位置。list指定要输入到内存的连续字节中的数据。有关集成记忆码的信息,请单击“相关主题”列表中的DebugA(汇编)。有关显示内存部分内容的信息,请单击“相关主题”列表中的DebugD(转储)。++范例假定键入以下命令:ecs:100Debug按下面的格式显示第一个字节的内容:04BA:0100EB.要将该值更改为41,请在插入点键入41,如下所示:04BA:0100EB.41_可以用一个e命令键入连续的字节值。在键入新值后按SPACEBAR(空格键),而不是按ENTER键。Debug显示下一个值。在此范例中,如果按三次SPACEBAR(空格键),Debug将显示下面的值:04BA:0100EB.4110.00.BC._要将十六进制值BC更改为42,请在插入点键入42,如下所示:04BA:0100EB.4110.00.BC.42_假定决定值10应该是6F。要纠正该值,请按HYPHEN键两次以返回到地址0101(值10)。Debug显示以下内容:04BA:0100EB.4110.00.BC.42-04BA:010200.-04BA:010110._在插入点键入6f更改值,如下所示:04BA:010110.6f_按ENTER停止e命令并返回到Debug提示符下。以下是字符串项的范例:eds:100Thisisthetextexample该字符串将从DS:100开始填充24个字节。++说明使用address参数如果在没有指定可选的list参数的值情况下指定address的值,Debug将显示地址和内容,在下一行重复地址,并等待您的输入。此时,您可以执行下列操作之一:·替换字节值。为此,请在当前值后键入新值。如果您键入的值不是有效的十六进制值,或该值包含两个以上的数字,则Debug不会回显无效或额外的字符。·进入下一个字节。为此,请按SPACEBAR(空格键)。要更改该字节中的值,请在当前值后键入新值。如果按SPACEBAR(空