debug命令


debug命令

文章插图
debug命令【debug命令】DEBUG是一个DOS实用程式,是供程式设计师使用的程式调试工具,可以用它检查记忆体中任何地方的位元组以及修改任何地方的位元组 。它可以用于逐指令执行某个程式以验证程式运行的正确性,也可以追蹤执行过程、比较一个指令执行前后的值以及比较与移动记忆体中数据的範围,读写档案与磁碟扇区 。
基本介绍中文名:程式调试工具命令
外文名:debug
性质:DOS实用程式
作用:供程式设计师使用的程式调试工具
优点:检查记忆体位元组
命令介绍它的功能包括以下几个方面 。⒈ 直接输入,更改,跟蹤,运行彙编语言源程式;⒉ 观察作业系统的内容;3.查看ROM BIOS的内容;
debug命令

文章插图
⒋观察更改RAM内部的设定值;⒌以扇区或档案的方式读写软碟数据DEBUG把所有数据都作为位元组序列处理 。因此它可以读任何类型的档案 。DEBUG可以识别两种数据: 十六进制数据和ASCⅡ码字元 。它的显示格式是各个位元组的十六进制值以及值在32与126之间的位元组的相应ASCⅡ码字元 。在DEBUG中输入数据有两种方法: 提示方法和非提示方法 。在用提示方法时,用户可以输入要求输入数据的命令,后跟数据所要输入的地址 。然后用户就可以看到该地址中已有内容及一个冒号提示符 。此时用户可以在提示符下输入一个新的值或者按下回车键或CTRL+C回到短横(-)提示符 。在运用非提示方法时,用户可以输入要输入数据的记忆体地址以及要输入的位元组 。但与使用字处理程式或正文编辑程式时不一样,在使用DEBUG时,用户不能直接移动游标到一入口点输入或修改数据,而要一次输入一个或几个位元组 。在使用DEBUG时可以只涉及记忆体中的数据,从而一般都要指定所要处理的记忆体地址,地址的输入格式是: [段地址]: [位移] 。如果没有输入地址,DEBUG将假定为当前记忆体段,从位于地址100H的位元组开始 。前100H位元组保留给程式段前缀使用,这一专用区域用于建立DOS与程式之间的联繫 。DEBUG总是用四位十六进制数表示地址 。用两位数表示十六进制数据 。讲到这里大家应该对DEBUG有了初步的了解,但是光知道这些可不够,接下来我来讲讲DEBUG的命令格式和命令 。当输入DEBUG,就调用了DEBUG程式,就会出现一个短横提示符,用户就可以在这一短横后输入DEBUG程式的命令 。有些DEBUG命令会显示一个记忆体地址并产生一个作为提示符的冒号 。在这些提示符后,用户可以输入一个新值以改变所显示位置原来的值 。如果用户不输入一个新值而是按下回车或CTRL+C,那幺原来的值不会改变 。一般用不着把地址和命令名字分开 。例如,用转储命令D察看100号地址的数据,那幺这个命令可以用以下任一种形式输入:D100D,100D 100如果输入的命令中出现了错误,DEBUG将在下一行对着错误的位置标记出来,例如:-s100 d 12^Error命令功能A 彙编命令功能: 将指令直接彙编成机器码输入到记忆体中 。说明: 用于小段程式的彙编及修改目标程式,所有输入的数字均採用十六进制,用户装入记忆体的彙编语句是连续存放的,若没有指定地址,并且前面没有使用彙编命令,该语句被彙编到 CS:0100区域 。例A:>DEBUG-a 010008F1:0100 MOV AH,0908F1:0102 MOV DX,10908F1:0105 INT 21H;08F1:0107 INT 21H;<-XP下运行cmd debug时,应该是INT 20H,21H会出遇无效指令错误08F1:0109 db 'May I help you $'08F1:0115←离开a状态-g ←运行May I help you 运行结果Program terminated normally表示运行正常C比较命令功能: 比较两记忆体区域中的内容是否相同,若不同则显示其地址和内容 。如:C4000:0 3F 100就是用来比较4000:0000-4000:003F与DS:0100-DS:013F之间的内容:其显示格式如下:记忆体地址1内含值1内含值2记忆体地址2例:比较4000:0 3F 100内容的差异-C4000:0 3F 1004000:0000 64 43 08F1:01004000:0001 3E 69 08F1:0101 显示内容的差异处4000:0002 78 FF 08F1:0102……………………………………如果要比较的範围在DS内,则段地址不必指出:如:-C 0 4 100;比较DS:0---DS:4与DS:100---DS:104C命令的另一种格式如下:C地址1 L 长度 地址2如:-C000:0 L4 0;由0000:0与与DS:0开始比较它同-C0000:0 3 0命令相等,显示结果如下:0000:0000 8A C0 08F1:00000000:0001 10 20 08F1:0001 它们都比较4个位元组0000:0002 1C 00 08F1:00020000:0003 49 7F 08F1:0003转储命令* D[地址] 或D[起始地址][目的地址] 转储命令功能: 以记忆体映象方式显示记忆体中的信息 。说明: 转储用左右两部分显示记忆体映象内容,左边以十六进制,右边以ASCⅡ字元显示,所有不可列印字元用句号( 。)表示 。每行显示16个位元组的内容,在第八和第九个位元组之间有一个连字元 - 此命令隐含的段地址为DS的值 。若未指定起始地址,则D命令从显示的最后一个单元的下一个单元开始显示,若以前没有使用给D命令,则从初使化的段暂存器的内容,加上地址偏移量 0100H 开始显示 。例:-d10,4f即为显示DS:4f的内容在D命令中如不指出段地址,则其默认为DS段 。如指明段地址,则从指明的段地址列出指定的範围如:-dfff:00:0f 我们也可以指定长度来列出所需要记忆体内容如:-d 100 L20即为显示由DS:100-DS:11F的内容,共20H个位元组:修改记忆体命令* E[地址] [位元组串)功能: 从指定的地址开始修改记忆体值 。格式:E起始地址[数据行]⑴用给定内容代替指定範围的单元内容-E地址 内容表例:-E100 41 42 43 44 48 47 46 45-D 100,L0808F1:0100 41 42 43 44 48 47 46 45 ABCDHGFE…⑵逐个记忆体内容例:-E 100:08F1:0100 76 42 :42是操作员键入此命令是将原100号记忆体内容76修改为42,用D命令可察看 。填写命令* F[地址範围] [位元组或位元组串] 填写命令功能: 将要填写的位元组或位元组串填入由地址範围指定的存储器中 。例:-f100 120 61 62 63 64-d100 11f08F1:0100 61 62 63 64 61 62 63 64 -61 62 63 64 61 62 63 abcd abcd abcd abcd08F1:0110 13 67 98 E3 C8 2E B3 B6 -03 21 AC 19 3121 4E 96 g……1…如果数据行超出指定的範围,则填不下的数值会被忽略 。例:-f 100 107 41 43 43 44 45 46 47 48 49 4A 4B 4C 4D -d 100,lof08F1:0100 41 42 43 44 45 46 47 64 -61 62 63 64 ABCDEFGdabcdabcd由上例可看出,超出範围的数据被忽略另外,F和E命令都可填入字元串:如:-F 100 105 "MSDOS"-d 100 l0f08F1:0100 4D 53 44 4F 53 46 47 64 -61 62 63 64 MS DOS FGabcd abcdG执行命令功能: 执行正在调试的程式,当达到断点时停止执行,并且显示暂存器标誌和下一条要执行的命令 。说明: 如果没有指定起始地址,那幺当前指令地址由CS,IP暂存器的内容来决定,如果用户指定起始地址就从指定的起始地址开始执行 。如果指定断点,当指令到达指令地址时停止执行,并显示各暂存器标誌位的内容和下一条要执行的命令,最多允许用户设定10个断点 。例:A:\>debug tan.exe-u:反编译成彙编语言程码…………. .-g 100 指定中断点Program terminated normally:另外:我们在DEBUG下可运行一个档案.EXE 如:A:\>debug tan.exe-g即可开始运行此程式,和在DOS下完全一样:十六进制算术运算命令* H[数值][数值] 十六进制算术运算命令功能: 分别显示两个十六进制数相加的和以及第一个数减去第二个数的差 。说明: 替用户完成简单的十六进制数的运算 。例:-h4538 56239B5B EF15I命令功能: 从指定的连线埠输入并显示(用十六进制)的一个位元组 。例:-i70F9;显示70连线埠的内容为F9I命令可由80X86的64K个连线埠取数据L命令功能: 将一个档案或盘的绝对扇区装入存储器 。说明: 单个L命令能够装入的最大扇区数是 80H,其中盘号 0,1,2,3……分别代表 A,B,C,……出现读盘错,显示错误信息 。⑴格式1.L装入地址 驱动器名 起始扇区/扇区数这种方式可把磁碟上指定扇区範围的内容装入到存储器从指定地址开始的区域中,在此外扇区编号引用逻辑/扇区的方式 。例:-L 100 0 01,将A驱的0扇区装至CS:100上-d 100 10f08F1:0100 EB 3C 90 3C 53 44 4F 53 -36 2E 32 32 02 01 01 00.L,MSDOS 6.22……⑵格式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……M数据命令功能: 把地址範围内的存储器单元的内容移到起始地址的指定地址中说明: 传送期间,源区和目标区可以部分重叠;传送后源区域数据保持不变 。例:-e100 41 42 43 44 45-d100 10f08F1:0100 41 42 43 44 45 62 62 63 64 -61 62 63 64 61 62 63 64 ABCDEBCDABCDABCD-M 100 104 110-d110 L1F08F1:0100 41 42 43 45 0A 21 19-20 01 01 20 07 96 87 9F ABCDE……N命令* N[盘号: ] [路径] [档案名称] [扩展名]功能: 定义操作档案名称 。说明: 可同时定义两个操作档案,并将形成的档案控制块相应的设定在记忆体 CS:5C和CS:6C上,供以后的L和W命令操作之用 。我们在运行程式侦错时,在启动DEBUG时在其后加档案程式名以及该程式的参数或运行档案,但当我们侦错一段后,可能装入其它档案来测试,这时我们可利用N命令来设定而无需退出DEBUG 。例:A:\>DEBUG tan.exe-n youg.pas当程式侦错一段时间后,若要把tan.exe装入tan1.pas则-ntanl.pasO输出命令功能: 传送位元组到指定的输出连线埠 。例:当我们遇到开机要求输入口令时,可用如下方式取消-O 70 10_O 71 00P进程命令功能: 将一个子程式调用指令,循环指令,中断指令或一个重複字元串指令,停止在下一条指令上 。说明: 在执行一条子程式调用指令,循环指令,中断指令或一个重複字元串指令时,发出P命令去执行有关指令,并且返回到要执行的下一条指令 。P命令和T一样选用来跟蹤程式运行过程用的命令,我们可以在P命令中指定程式运行的起始地址,指令个数,如未指定则CS:IP所指定程式的地址开始一次运行一条令 。P与T命令的差别在于P命令把CALL/INT当成一条指令来执行,简化了跟蹤过程,P命令只运行RAM记忆体的命令,而T命令则可运行RAM和ROM里的程式 。R暂存器命令功能: 一,显示单个暂存器的内容,并提供修改功能 。二,显示所有暂存器内容,再加上字母标誌位状态以及要执行的下一条指令 。三,显示8个标誌位状态,并提供修改功能 。若不想改变则回车即可 。例:-r bxbx 0050:51-rAX=0000 BX=0051 CX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0003 ES=0CD3 SS=0CD3 IP=0100 NV UP EI PL NZ NA PO NC0CD3:0100 0F DB OF若想改变标誌暂存器,用-RF回车,则DEBUG会将标誌内容显示出来,若想改变任一标誌,只要输入该标誌的名称即可 。标誌名称 设定 未设定 标誌名称 设定 未设定滋出 OV(溢出) NV(未溢出) 零位 ZR NZ(不等于零)方向 DN(减少) UP(增加) 辅助进位 AC NA(无进位)中断 EI(许可) DI(禁止) 奇偶标誌 PE(偶) PO(奇)符号 NG(负) PL(正) 进位 CY NC(清除进位)例:-RfNV UP EI PL NZ NA PO NC :-OV DI← 输入值S命令功能: 在指定的地址範围内查找给定的字元串 。说明: 用来指定在地址範围内查找一个字元串,若找到则显示其地址,否则直接显示DEBUG提示符 。隐含地址为DS段值 。在此记忆体可以用(起始地址)(终止地址)或(起始地址)L(长度)的方式来表示,而字元串与数据行则可混合使用:如:02.76"BC" 。例:-d100 lof08F1:0100 OF 2A 41 43 0B 31 42 96 -FF F0 B9 8A F3 00 B1.. AC,1B... -S 100 lof"AC"08F1:0102← 表示找到,由0102开始,T跟蹤命令功能: 逐条跟蹤程式的执行,每条指令执行后都将显示各暂存器的内容 。说明: 通常採用跟蹤一条指令,但用户也可以用指令条数设定一次跟蹤多条指令,每执行一条指令之后,显示所有暂存器的内容和标誌状态 。逐条指令跟蹤 -T[=起始地址]从指定地址起执行一条指令后停下来,显示所有暂存器内容及标誌位的值,如来指定地址则从当前CS:IP开始执行 。A:\>DEBUG-A08F1:0100 MOV DL,03H08F1:0102 MOV AH,02H08F1:0104 INT 21H08F1:0106 INT 20H08F1:0108-TAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=08F1 ES=08F1 SS=08F1 CS=08F1 1P=0105 NV UP EI PL NZ PO CY09F1:0102 B402 MOV AH,02若指定起始地址,则T命令会从指定的地址开始跟蹤,我们还可以指定跟蹤一次所运行指令的个数,用Ctrl+S暂停萤幕的显示,以便观察 。-t=100 10;由CS:100开始跟蹤10条指令U地址命令功能: 将记忆体中的内容转换为彙编语句 。说明: 反彙编的位元组数取决与用户的系统显示形式,以及在U命令中使用的可选项 。⑴从指定地址开始编译,反彙编32个位元组-U[地址]←从CS:100开始,其反彙编32个位元组如果地址被省略,则从一个U命令的最后一条指令的下一条单元开始彙编32个位元组 。⑵对指定的存贮範围进行反彙编-u起始地址 终止地址(L 长度)例:-U 100 10908F1:0100 CD20 INT 2008F1:0102 FF9F009A CALL FA12[BX+9A00]08F1:0106 F0 LOCK08F1:0107 FE1D CALL FAR [DI]08F1:0109 F0 LOCK说明:如指定了範围则整个範围全都会被反编译W写盘命令* W[地址] [盘符:] [起始扇区] [扇区数] 写盘命令功能: 将修改过的数据写到磁碟上 。说明: 可以将指定记忆体地址开始的数据写在磁碟上,可以在没有指定参数,或指定地址参数的情况下,将调试档案写在磁碟上 。在运行W时需设定档案的大小CX或BX暂存器⑴把数据写入磁碟的指定扇区-W 起始地址 驱动器名 起始扇区 扇区数 ⑵把数据写入指定档案中-W 起始地址例A:\>DEBUG-A08f1:0100..... 写入程式段08F1: 012A....-R CXCX:0000:2A←写入位元组数,即为程式结尾地址减起始地址-n tan.com←设定档案名称,需后缀为com-wWring 002A bytes-qA:\>TAN←即可执行此程式"XD"命令* "XD"命令:释放EMS记忆体例:-XD 0001handle 0001 deallocatel←释放了利用XD释放后可再分配"XM"命令*"XM"命令;把扩充记忆体上的记忆体页区映射到主记忆体区格式:XM RAM 长页码 主记忆体页码句柄例:-XM3 2 0001←把0001号句柄的第3号逻辑页区映射到2号真实页区Logical page 03 mapped to physical page 02"XS"命令*"XS"命令:显示当前EMS使用情况 。格式 -XS实际套用⒈ 非物理0磁轨坏软碟的修复此种损坏从软碟盘面上来看并没有明显的划伤和霉变 。一般可以恢复其数据,也可使软碟重新在利用 。处理方法如下:Ⅰ. 进入debugⅡ. 取一张引导区没有损坏的好磁碟,插入软碟机-l 100 0 0 1Ⅲ. 插入损坏的磁碟到软碟机-w 100 0 0 1-q注意:好盘与坏盘容量必须相同⒉ 物理0磁轨坏软碟中的数据读取对于0磁轨损坏的磁碟,一般来说是应该抛弃了,当你也不妨试一试已下方法:磁化处理:用较强的磁铁在靠近坏磁碟的表面处反覆移动,切不可碰到磁碟介质,以免划伤表面,然后在试试格式化 。软碟换面:小心的将磁碟打开,坚磁片与金属晶片分开,翻面后再按原来的方法粘在一起即可,在重新格式化 。diskfix:对于diskfix想必大家都用的比较多了,里面的磁碟修复功能很好用的 。能修复大多数磁碟表面错误 。⒊ 硬碟启动失败处理在正常机上格式化一张软碟,无其它数据进入debug-l 0 2 0 1-w 0 0 0 1-q用系统盘启动故障机后在进入debug-l 0 0 0 1-w 0 2 0 1-q⒋ 软碟不能正确读取解决方法如果使用软碟时出现如下提示general failure error reading drive a 可以用以下方法解决:将一张好盘插入软碟机进入debug-a 100****:*100 mov al,0****:**** mov cx,1****:**** mov dx,0****:**** mov bx,1000****:**** int 25****:**** int 20回车-g=0100插入坏盘并进入debug-a 200****:*100 mov al,1****:**** mov cx,1****:**** mov dx,0****:**** mov bx,1000****:**** int 26****:**** int 20回车-g=200⒌ cmos 数据的保存,恢复cmosram的’地址口’的口地址为 70h ’数据口’的口地址为 71h 读取时只需将读的cmosram的地址送到70h,随后就可以从71 h中得到所需数据 。⑴读取cmos数据 进入debug-a 100****:*100 mov bx,1000****:**** mov cx,0040****:**** mov ax,0000****:0109 mov dx,cx****:**** mov cx,0005****:010e loop 010e****:**** out 70,al****:**** mov cx,0005****:0115 loop 0115****:**** in al,71****:**** mov 【bx】,al****:**** cmp ah,0e****:**** jb 0123****:**** add ah,80****:0123 inc ah****:**** inc bx****:**** mov cx,dx****:**** mov al,ah****:**** loop 0109****:**** mov ah,3c****:**** mov dx,0150****:**** mov cx,0020****:**** int 21****:**** mov bx,ax****:**** mov dx,1000****:**** mov cx,0040****:**** mov ah,40 ****:**** int 21****:**** mov ah,4c****:**** int 21-a 150****:0150 db "cmos.dat",0****:0159-r cxcx 0000:60-n save cmos.com-w-q-w 100 2 0 1-q⑵恢复cmos数据 进入debug-a 100****:*100 mov cx,0150****:**** mov ah,3d****:**** mov al,00****:**** int 21****:**** mov dx,1000****:**** mov bx,ax****:**** mov cx,0040****:**** mov ah,3f****:**** int 21****:**** mov ax,0000****:**** mov bx,dx****:**** mov dx,cx****:**** mov cx,0005****:**** loop 011f****:**** mov al,ah****:**** out 70,al****:**** mov cx,0005****:**** loop 0128****:**** mov al,【bx】****:**** out 71,al****:**** jb 0136****:**** add ah,80****:**** inc ah****:**** inc bx****:**** mov cx,dx****:**** loop 011a****:**** mov ax,0040****:**** mov ds,ax****:**** mov ax,1234****:**** mov 【0072】,ax****:**** jmp ffff:0000-a 150****:0150 db "cmos.dat",0****:0159-r cx cx 0000:60-n write cmos.com-w-q⒍ dos 引导扇区数据的保存与恢复dos引导程式是被读到记忆体0000:7c00初开始执行的获得正常的引导程式进入debug-l 100 2 0 1-n a:dosboot.com-r cx:200-w-q装入引导程式进入debug-n a:dosboot.com-l-r cx:200-w 100 2 0 1-q⒎ 硬碟主引导扇区数据的保存与恢复硬碟工作正常时读取主引导扇区信息注意:当分区改变时不能用此数据恢复保存主引导扇区数据进入debug-a 100mov ax,0201mov bx,0110mov cx,0001mov dx,0080int 13int 3-g=100-e 102 3-e 10e c3-r bxbx 0110:0-r cxcx 0001:210-n a:rboot.com-w-q恢复主引导扇区数据:只需运行a盘的rboot.com⒏ 硬碟非分配表备份与恢复计算机运行正常时分配表备份进入debug-l 100 2 0 1-n a:dbrup.dat-r cx:200-w恢复进入debug-n a:dbrup.dat-l-w 100 2 0 1-q⒐ 硬碟保护卡内幕对于经常在外边上机的人来说,计算机维护人员一旦设定硬碟保护卡,自己作一些事来特别麻烦,想不想禁止掉硬碟保护卡,用以下方法或许可以借鉴:进入debug-a 100mov ah,0mov dl,0int 13-t一直按t知道找到 cs=f000 记下此时 ds 的值 如:1234-e e0:4c34 12 00 f0-q⒑ 用debug作硬碟低级格式化 硬碟低级格式化一般用dm,但debug也可以低级格式化硬碟进入debug-a 100mov ax,500mov bx,180mov cx,0mov dx,80int 13int 3-e 180 0 0 0 2-q⒒ 冷启动与热启动用debug实现系统冷启动与热启动程式冷启动:-a 100jmp ffff:0int 20-n a:reset.com-r cx:0007-w-q热启动:-a 100mov ax,0040mov ds,axmov ax,1234mov si,0072mov (si),axjmp ffff:0-n a:rset.com-r cx:0014-w-q⒓ dos内部命令加密如加密 dir用pctools或diskedit找 c:下的command.com档案编辑该档案pctools中:f-----f1 然后找所有03 44 49 52 找到后按f5修改成你所要的值 如:foo 以后只有输入foo 才能列出档案或档案目录 。diskfix 有良好的界面,操作起来和pctools差不多 。注意:如果不能修改,则解开档案的锁定 luck其它命令代码type 04 54 59 50 45cd 02 43 44del 03 44 45 44copy 04 43 49 50 59