DEBUG工具命令辞典 谭永伦 1996-06-28 DEBUG是为DOS提供的有力的侦错,跟踪程序运行,检查系统数据的工具程序,要很好地使用它必须具备一定的汇编程序设计和硬件基本知识的能力,当然,它为汇编语言程序员提供了有效的调试手段,它的功能包括以下几个方面。 1. 直接输入、更改、跟踪、运行汇镅栽闯绦颍华 2. 观察操作系统的内容; 3. 查看ROM BIOS的内容; 4. 观察更改RAM内部的设置值; 5. 以扇区或文件的方式读写软盘数据。 在DEBUG中地址用段地址与段内地址来表示,而段地址可以明确地指出来,也可以用一个段指示器(段寄存器)来代表,用段寄存器表示时,其段地址就是此寄存器的内含值: 如:用段地址和段内地址表示FOFF:0100 用段寄存器和段内地址表示CSF:0100←CS指向F000 二、DEBUG程序的调用 在DOS提示符下可键入以下命令: DEBUG[d:][path][文件名][参数1][参数2] 其中文件名是被调试文件的名字,其后缀需为EXE或COM文件,d:和path为被调用文件所在的盘符和路径,两个参数是运用被调试文件所需的参数,方括号“[]”中的选项可选项,回车后出现“-”提示符,就可用所需的DEBUG命令。 三、DEBUG命令 1.“?”命令 此命令在“-”之后键入“?”回车即可出现DEBUG命令的所有说明,读者一用即知。 2.“A”命令:将汇编语言源程序译成机器码,并存入内存地址。 格式:-A[起始地址] 如果A后无地址,则DEBUG会将DS:100定为起始地址; 例A:>DEBUG -a 0100 08F1:0100 MOV CH,09 08F1:0102 MOV DX,109 08F1:0105 INT 21H 08F1:0107 INT 21H 08F1:0109 db 'May I help you $' 08F1:0115 ←离开a状态 -g ←运行 May I help you 运行结果 Program terminated normally←表示运行正常 3. “C”命令:比较两段内存区内容并列出相异式。 格式:C第一段起始地址 第一段终止地址 第二段起始地址 如:C4000:0 3F 100 就是用来比较4000:0000-4000:003F与DS:0100-DS:013F之间的内容:其显示格式如下: 内存地址1 内含值1 内含值2 内存地址2 例:比较4000:0 3F 100内容的差异 -C4000:0 3F 100 4000:0000 64 43 08F1:0100 4000:0001 3E 69 08F1:0101 4000:0002 78 FF 08F1:0102 .....................显示内容的差异处 如果要比较的范围在DS内,则段地址不必指出: 如:-C 0 4 100;比较DS:0__DS:4与DS:100__DS:104 C命令的另一种格式如下:C地址1 L长度 地址2 如:-C0000:0 L4 0 ;由0000:0与DS:0开始比较 它同-C0000:0 3 0 命令相等,显示结果如下: 0000:0000 8A C0 08F1:0000 0000:0001 10 20 08F1:0001 0000:0002 1C 00 08F1:0002 0000:0003 49 7F 08F1:0003它们都比较4个字节 4.“D”命令:将指定内存区内容列出 格式 D[范围] D命令可以列出指定内存内容,并分别以十六进制及ASCII 字符显示出来, 其中在ASCII字符区,英文字母及数字分别在十六进制区用41-5A和30-39表示大写A-Z和0-9,61-7A表示小写a-z,用D命令时,其列出内存内容的第8到第9之间有一个减号“-”连接,以方便观察。 例:-d10,4f 即为显示DS:10-DS:4F的内存内容 在D命令中如不指出段地址,则其默认为DS段。 如指明段地址,则从指明的段地址列出指定的范围 如:-dffff:00,0f 我们也可以指定长度来列出所需要内存内容 如:-d 100 L20即为显示由DS:100-DS:11F的内容,共20H个字节: 若没有指定范围,则会从上一个D命令所显示的最后的地址接干来显示128个字节,即7FH个。 5.“E”命令:修改内存内容的命令 格式:E起始地址[数据行] (1) 用给定内容代替指定范围的单元内容 -E 地址 内容表 例:-E100 41 42 43 44 48 47 46 45 -D 100,L08 08F1:0100 41 42 43 44 48 47 46 45 ABCDHGFE… (2) 逐个内存内容 例:-E 100: 08F1:0100 76 42 :42是操作员键入 此命令是将原100号内存内容76修改为42,用D命令可察看 6.“F”命令:将数据填入指定的范围 格式:F范围 数据行 说明:F命令将数据行填入F所设定的范围内,如果数据未能一次填范围,则其会重复地填入,直至填满。 例:-f100 120 61 62 63 64 -d100 11f 08F1:0100 61 62 63 64 61 62 63 64 -61 62 63 64 61 62 63 abcd abcd abcd abcd 08F1:0110 13 67 98 E3 C8 2E B3 B6 -03 21 AC 19 31 21 4E 96 g.......l... 如果数据行超出指定的范围,则填不下的数值会被忽略。 例:-f 100 l07 41 43 43 44 45 46 47 48 49 4A 4B 4C 4D -d 100,lof 08F1:0100 41 42 43 44 45 46 47 64 -61 62 63 64 61 62 63 64 ABCDEFGdabcdabcd 由上例可看出,超出范围的数据被忽略 另外,F和E命令都可填入字符串: 如:-F 100 105 “MSDOS” -d 100 lof 08F1:0100 4D 53 44 4F 53 46 47 64 -61 62 63 64 61 62 63 64 MS DOS FGabcd abcd 7.“G”命令:运行机器码程序 格式:-G[=起始地址][中断点1]…… 例:A:\>debug tan.exe -u:反编译成汇编语言程码 ......... . . -g 100←指定中断点 Program terminated normally: 另外:我们在DEBUG 下可运行一个文件.EXE 如:A:\>debug tan.exe -g 即可开始运行此程序,和在DOS下完全一样: 8.“H”命令:以十六进制计算两个数的和与差。 格式:H 数值1 数值2 例:-h 4538 5623 9B5B EF15 - 9.“I”命令:显示I/O端口数据 格式:I I/O端口地址 例:-i 70 F9 ;显示70端口的内容为F9 I命令可由80X86的64K个端口取数据 10.“L”命令:将文件或扇区的数据装入内存 格式:L[装入地址[驱动器名 起始/扇区/扇区数]] (1) 格式1. L装入地址 驱动器名 起始扇区/扇区数 这种方式可把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中,在此外扇区编号引用逻辑/扇区的方式。 例:-L 100 0 01 ,将A驱的0扇区装至CS:100上 -d 100 10f 08F1:0100 EB 3C 90 3C 53 44 4F 53 -36 2E 32 32 02 01 01 00 .L.MSDOS 6.22…… (2) 格式2: L装入地址 这种方式可把指定文件装入内存,装入的文件可在进入DEBUG时指定亦可用N命令建立,格式为-n文件名: 例1 DEBUG tan.pas -L 100 例2 DEBUG -n tan.pas -L 100 须知:L命令只能读取逻辑扇区,不能读取硬盘分区表 L 命令中所用的磁盘代码A=00,B=01,C=02..... 11.“M”命令:移动内存中数据 格式:M范围 目的地址 M命令将指定的范围移到目的地址上,其实M命令做的不是移动而是拷贝的动作,经移动的源地址和目的地址内容一样。 例:-e100 41 42 43 44 45 -d100 l0f 08F1:0100 41 42 43 44 45 62 63 64-61 62 63 64 61 62 63 64 ABCDEBCDABCDABCD -M 100 104 110 -d110 L1F 08F0:0100 41 42 43 44 45 0A 21 19-20 01 01 20 07 96 87 9F ABCDE....... 12.“N”命令:命名命令 格式:N 路径名1 [路径名2] 说明:我们在运行程序侦错时,在启动DEBUG 时在其后加文件程序名以及该程序的参数或运行文件,但当我们侦错一段后,可能装入其它文件来测试,这时我们可利用N命令来设置而无需退出DEBUG。 例:A:\>DEBUG tan.exe -n yong.pas 当程序侦错一段时间后,若要把tan.exe装入tan1.pas则用-n tan1.pas即可 13.“O”命令:将1个字节的数据送往I/O端口地址 格式:O输出地址数据 例:当我们遇到开机要求输入口令时,可用如下方式取消 -O 70 10 -O 71 00 14.“P”命令:运行指定地址上的程序,可以指定指令个数格式:P[=地址] [指令个数] P命令和T一样选用来跟踪程序运行过程用的命令,我们可以在P命令中指定程序运行的起始地址,指令个数,如未指定则从CS:IP所指定的地址开始一次运行一条指令。 P与T命令的差别在于P命令把CALL/INT当成一条指令来执行,简化了跟踪过程,P命令只运行RAM内存的命令,而T命令则可运行RAM和ROM里的程序。 15.“R”命令:显示及更改寄存器值。 格式:R[寄存器名] 在R指令后加入寄存器名,则DEBUG会单独显示此寄存器名并等待输入新值,若不想改变则回车即可。 例:-r bx bx 0050 :51  -r AX=0000 BX=0051 CX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0003 ES=0CD3 SS=0CD3 1P=0100 NV UP EI PL NZ NA PO NC 0CD3:0100 0F DB OF 若想改变标志寄存器,用-RF回车,则DEBUG会将标志内容显示出来,若想改变任一标志,只要输入该标志的名称即可。 标志名称 设置 未设置 标志名称 设置 未设置 溢出 OV(溢出) NV(未溢出) 零位 ZR NZ(不等于零) 方向 DN(减少) UP(增加) 辅助进位 AC NA(无进位) 中断 EI(许可) DI(禁止) 奇偶标志 PE(偶) PO(奇) 符号 NG(负) PL(正) 进位 CY NC(清除进位) 例:-Rf NV UP EI PL NZ NA PO NC:- OV DI←输入值 16.“S”命令:从指定的内存区找出指定的数据。 格式:S内存 字符串(数据行) 在此内存可以用(起始地址)(终止地址)或(起始地址)L(长度)的方式来表示, 而字符串与数据行则可混合使用:如:0276“BC”。 例:-d100 lof 08F1:0100 OF 2A 41 43 0B 31 42 96 -FF F0 7F B9 8A F3 00 B1 .. AC. 1B...... -S 100 lof"AC" 08F1:0102 ←表示找到,由0102开始, 17.“T”命令;跟踪程序运行 格式:T[=起始地址][运行次数] (1) 逐条指令跟踪 -T[=起始地址] 从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值,如来指定地址则从当前CS:1P开始执行。 A:\>DEBUG -A 08F1:0100 MOV DL,03H 08F1:0102 MOV AH,02H 08F1:0104 INT 21H 08F1:0106 INT 20H 08F1:0108 -T AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=08F1 ES=08F1 SS=08F1 CS=08F1 1P=0105 NV UP EI PL NZ NA PO CY 08F1:0102 B402 MOV AH,02 若指定起始地址,则T命令会从指定的地址开始跟踪, 我们还可以指定跟踪一次所运行指令的个数,用Ctrl+S可暂停屏幕的显示,以便观察。 -t=100 10;由CS:100开始跟踪10条指令 18.“u”命令:反汇编命令: 格式:u[内存范围]或[地址] (1) 从指定地址开始编译,反汇编32个字节 -U[地址]←从CS:100开始,共反汇编32个字节 如果地址被省略,则从上一个U命令的最后一条指令的下一条单元开始反汇编32 个字节。 (2) 对指定的存贮范围进行反汇编 -u 起始地址 终止地址(L长度) 例:-U 100 109 08F1:0100 CD20 INT 20 08F1:0102 FF9F009A CALL FA12[BX+9A00] 08F1:0106 F0 LOCK 08F1:0107 FE1D CALL FAR [DI] 08F1:0109 F0 LOCK 说明:如指定了范围则整个范围全都会被反编译 19.“W”写命令:将程序写入软盘或文件中。 格式:W[起始地址[驱动器名 起始扇区 扇区数]] 在运行W时需设置文件名及文件的大小CX或BX寄存器 (1) 把数据写入磁盘的指定扇区 -W 起始地址 驱动器名 起始扇区 扇区数 (2) 把数据写入指定文件中 -W 起始地址 例 A:\>DEBUG -A 08f1:0100...... . 08F1:012A......写入程序段 -R CX CX:0000 :2A ←写入字节数,即为程序结尾地址减起始地址 -n tan.com←设置文件名,需后缀为com -w Wring 002A bytes -q A:\>TAN ←即可执行此程序 20.“XA”命令:配制EMS内存 在用此命令及XD、XS时,要先将EMM386.EXE装入, 否则 DEBUG 会现示 EMS not installed 格式:XA 内存页数(每页16K) 例:-XA 4←配置4页EMS内存 Handle created=0001←已配置,且分配0001号句柄 21.“XD”命令:释放EMS内存 例:-XD 0001 handle 0001 deallocatel←释放了 利用XD释放后可再分配 22.“XM”命令;把扩充内存上的内存页区映射到主内存区 格式:XM RAM长页码 主内存页码句柄 例:-XM 3 2 0001←把0001号句柄的第3号逻辑页区映射到2号真实页区 Logical page 03 mapped to physical page 02 23.“XS”命令:显示当前EMS使用情况。 格式 -XS 24.“Q”命令:退出DEBUG程序 格式:-Q 它退出时不存盘,如需存盘先用W命令,然后再退出