DEBUG命令谁知道多少?

лл... лл 展开
 我来答
匿名用户
2013-11-19
展开全部
debug命令   DEBUG命令参数详解
  DEBUG是一个DOS实用程序,是供程序员使用的程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。它可以用于逐指令执行某个程序以验证程序运行的正确性,也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中数据的范围,读写文件与磁盘扇区。
  它的功能包括以下几个方面。
  1,直接输入,更改,跟踪,运行汇编语言源程序;
  2,观察操作系统的内容;
  3,查看ROM BIOS的内容;
  4,观察更改RAM内部的设置值;
  5,以扇区或文件的方式读写软盘数据
  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号地址的数据,那么这个命令可以用以下任一种形势输入:
  D100
  D 100
  D。100
  D,100
  如果输入的命令中出现了错误,DEBUG将在下一行对着错误的位置标记出来,例如:
  -s100 d 12
  ^Error
  DEBUG的命令及功能如下:
  * A[地址] 汇编命令
  功能: 将指令直接汇编成机器码输入到内存中。
  说明: 用于小段程序的汇编及修改目标程序,所有输入的数字均采用十六进制, 用户装入内存的汇编语句是连续存放的,若没有指定地址,并且前面没有使用汇编命令,改语句被汇编到 CS:0100区域。
  例A:>DEBUG
  -a 0100
  08F1:0100 MOV AH,09
  08F1:0102 MOV DX,109
  08F1: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 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
  如:-C000:0 L4 0;由0000:0与与DS:0开始比较它同-C0000:0 3 0命令相等,显示结果如下:
  0000:0000 8A C0 08F1:0000
  0000:0001 10 20 08F1:0001 它们都比较4个字节
  0000:0002 1C 00 08F1:0002
  0000:0003 49 7F 08F1:0003
  * D[地址] 或D[起始地址][目的地址] 转储命令
  功能: 以内存映象方式显示内存中的信息。
  说明: 转储用左右两部分显示内存映象内容,左边以十六进制,右边以ASCII字符显示,所有不可打印字符用句号(。)表示。每行显示16个字节的内容,在第八和第九个字节之间有一个连字符 - 此命令隐含的段地址为DS的值。若未指定起始地址,则D命令从显示的最后一个单元的下一个单元开始显示,若以前没有使用给D命令, 则从初使化的段寄存器的内容,加上地址偏移量 0100H 开始显示。
  例:-d10,4f即为显示DS:4f的内容在D命令中如不指出段地址,则其默认为DS段。
  如指明段地址,则从指明的段地址列出指定的范围
  如:-dfff:00:0f
  我们也可以指定长度来列出所需要内存内容
  如:-d 100 L20即为显示由DS:100-DS:11F的内容,共20H个字节:
  * 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命令可察看。
  * 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 3121 4E 96 g……1…
  如果数据行超出指定的范围,则填不下的数值会被忽略。
  例:-f 100 107 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 ABCDEFGdabcdabcd
  由上例可看出,超出范围的数据被忽略
  另外,F和E命令都可填入字符串:
  如:-F 100 105 "MSDOS"
  -d 100 l0f
  08F1:0100 4D 53 44 4F 53 46 47 64 -61 62 63 64 MS DOS FGabcd abcd
  * G[=起始地址] [[断点]……] 执行命令
  功能: 执行正在调试的程序,当达到断点时停止执行, 并且显示寄存器标志和下一条要执行的命令。
  说明: 如果没有指定起始地址,那么当前指令地址由CS,IP寄存器的内容来决定,如果用户指定起始地址就从指定的起始地址开始执行。如果指定断点,当指令到达指令地址时停止执行,并显示各寄存器标志位的内容和下一条要执行的命令,最多允许用户设定10个断点。
  例:A:\>debug tan.exe
  -u:反编译成汇编语言程码
  …………
  . .
  -g 100 指定中断点
  Program terminated normally:
  另外:我们在DEBUG下可运行一个文件.EXE
  如:A:\>debug tan.exe
  -g
  即可开始运行此程序,和在DOS下完全一样:
  * H[数值][数值] 十六进制算术运算命令
  功能: 分别显示两个十六进制数相加的和以及第一个数减去第二个数的差。
  说明: 替用户完成简单的十六进制数的运算。
  例:-h4538 5623
  9B5B EF15
  * I[端口地址]
  功能: 从指定的端口输入并显示(用十六进制)的一个字节。
  例:-i70
  F9;显示70端口的内容为F9
  I命令可由80X86的64K个端口取数据
  * L[地址][盘号:][逻辑扇区号][扇区数]
  功能: 将一个文件或盘的绝对扇区装入存储器。
  说明: 单个L命令能够装入的最大扇区数是 80H,其中盘号 0,1,2,3……分别代表 A,B,C,……出现读盘错,显示错误信息。
  (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……
  * M[地址范围][起始地址] 数据传送命令
  功能: 把地址范围内的存储器单元的内容移到起始地址的指定地址中
  说明: 传送期间,源区和目标区可以部分重叠;传送后源区域数据保持不变。
  例:-e100 41 42 43 44 45
  -d100 10f
  08F1:0100 41 42 43 44 45 62 62 63 64 -61 62 63 64 61 62 63 64 ABCDEBCDABCDABCD
  -M 100 104 110
  -d110 L1F
  08F1:0100 41 42 43 45 0A 21 19-20 01 01 20 07 96 87 9F ABCDE……
  * N[盘号: ] [路径] [文件名] [扩展名]
  功能: 定义操作文件名。
  说明: 可同时定义两个操作文件,并将形成的文件控制块相应的设置在内存 CS:5C和CS:6C上,供以后的L和W命令操作之用。我们在运行程序侦错时,在启动DEBUG时在其后加文件程序名以及该程序的参数或运行文件,但当我们侦错一段后,可能装入其它文件来测试,这时我们可利用N命令来设置而无需退出DEBUG。
  例:A:\>DEBUG tan.exe
  -n youg.pas
  当程序侦错一段时间后,若要把tan.exe装入tan1.pas则-ntanl.pas
  * O[端口地址][数据] 输出命令
  功能: 发送字节到指定的输出端口。
  例:当我们遇到开机要求输入口令时,可用如下方式取消
  -O 70 10
  _O 71 00
  * P[=地址] [数据] 进程命令
  功能: 将一个子程序调用指令,循环指令,中断指令或一个重复字符串指令,停止在下一条指令上。
  说明: 在执行一条子程序调用指令,循环指令,中断指令或一个重复字符串指令时,发出P命令去执行有关指令,并且返回到要执行的下一条指令。 P命令和T一样选用来跟踪程序运行过程用的命令,我们可以在P命令中指定程序运行的起始地址,指令个数,如未指定则CS:IP所指定程序的地址开始一次运行一条令。
  P与T命令的差别在于P命令把CALL/INT当成一条指令来执行,简化了跟踪过程,P命令只运行RAM内存的命令,而T命令则可运行RAM和ROM里的程序。
  * Q 退出命令。
  * R[寄存器] 寄存器命令
  功能: 一,显示单个寄存器的内容,并提供修改功能。 二,显示所有寄存器内容, 再加上字母标志位状态以及要执行的下一条指令。 三,显示8个标志位状态, 并提供修改功能。若不想改变则回车即可。
  例:-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 IP=0100 NV UP EI PL NZ NA OP 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← 输入值
  * S[地址范围] [字符串]
  功能: 在指定的地址范围内查找给定的字符串。
  说明: 用来指定在地址范围内查找一个字符串,若找到则显示其地址, 否则直接显示DEBUG提示符。隐含地址为DS段值。
  在此内存可以用(起始地址)(终止地址)或(起始地址)L(长度)的方式来表示,而字符串与数据行则可混合使用:如:02.76"BC"。
  例:-d100 lof
  08F1: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
  -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 PO CY
  09F1:0102 B402 MOV AH,02
  若指定起始地址,则T命令会从指定的地址开始跟踪,我们还可以指定跟踪一次所运行指令的个数,用Ctrl+S暂停屏幕的显示,以便观察。
  -t=100 10;由CS:100开始跟踪10条指令
  * 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
  说明:如指定了范围则整个范围全都会被反编译
  * 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←即可执行此程序
  * "XD"命令:释放EMS内存
  例:-XD 0001
  handle 0001 deallocatel←释放了
  利用XD释放后可再分配
  *"XM"命令;把扩充内存上的内存页区映射到主内存区
  格式:XM RAM 长页码 主内存页码句柄
  例:-XM3 2 0001←把0001号句柄的第3号逻辑页区映射到2号真实页区
  Logical page 03 mapped to physical page 02
  *"XS"命令:显示当前EMS使用情况。
  格式 -XS
  实用debug命令集锦
  1. 非物理0磁道坏软盘的修复
  此种损坏从软盘盘面上来看并没有明显的划伤和霉变。一般可以恢复其数据,也可是软盘重新在利用。
  处理方法如下:
  ⅰ. 进入debug
  ⅱ. 取一张引导区没有损坏的好磁盘,插入软驱
  -l 100 0 0 1
  ⅲ. 插入损坏的磁盘到软驱
  -w 100 0 0 1
  -q
  注意:好盘与坏盘容量必须相同
  2. 物理0磁道坏软盘中的数据读取
  对于0磁道损坏的磁盘,一般来说是应该抛弃了,当你也不妨试一试已下方法:
  磁化处理:用较强的磁铁在靠近坏磁盘的表面处反复移动,切不可碰到磁盘介质,以免划伤表面,然后在试试格式化。
  软盘换面:小心的将磁盘打开,坚磁片与金属芯片分开,方面后再按原来的方法粘在一起即可,在重新格式化。
  diskfix:对于diskfix想必大家都用的比较多了,里面的磁盘修复功能很好用的。能修复大多数磁盘表面错误。

 
亚远景信息科技
2024-12-11 广告
上海亚远景信息科技有限公司是国内汽车行业咨询及评估领军机构之一,深耕于ASPICE、敏捷SPICE、ISO26262功能安全、ISO21434车辆网络安全领域,拥有20年以上的行业经验,专精于培训、咨询及评估服务,广受全球车厂及供应商赞誉,... 点击进入详情页
本回答由亚远景信息科技提供
匿名用户
2013-11-19
展开全部
Debug 命令大全 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:100 110
d cs:100 110
d,cs:100,110
指定有效地址项
Debug 命令中的 address 参数指定内存位置。Address 是一个包含字母段记录的二位名称或一个四位字段地址加上一个偏移量。可以忽略段寄存器或段地址。a,g,l,t,u 和 w 命令的默认段是 CS。所有其他命令的默认段是 DS。所有数值均为十六进制格式。
有效地址如下:
CS:0100
04BA:0100
在段名和偏移量之间要有冒号。
指定有效范围项
Debug 命令中的 range 参数指定了内存的范围。可以为 range 选择两种格式:起始地址和结束地址,或者起始地址和长度范围(由 l 表示)。
例如,下面的两个语法都可以指定从 CS:100 开始的 16 字节范围:
cs:100 10f
cs:100 l 10
++
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(执行)
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 将在它上次停止处开始汇编。
有关将数据输入到指定字节中的信息,请单击“相关主题”列表中的 Debug E(键入)。
有关反汇编字节的信息,请单击“相关主题”列表中的 Debug U(反汇编)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式