代码改变世界

[网络整理]DEBUG命令使用解析一

2009-03-16 21:08  马伟  阅读(644)  评论(0编辑  收藏  举报
启动 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: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 将在它上次停止处开始汇编。
  有关将数据输入到指定字节中的信息,请单击“相关主题”列表中的 Debug E(键入)。
  有关反汇编字节的信息,请单击“相关主题”列表中的 Debug U(反汇编)。

  范例
  a 命令支持所有形式的间接注册命令,如下例所示:
  add bx,34[bp+2].[si-1]
  pop [bp+di]
  push [si] )

  还支持所有操作码同义词,如下例所示:
  loopz 100
  loope 100
  ja 200
  jnbe 200
  对于 8087 操作码,必须指定 wait 或 fwait 前缀,如下例所示:
  fwait fadd st,st(3) ; this line assembles
  ; an fwait prefix

  说明
  使用记忆码
  段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用 movsw 可以移动 16 位的字串,使用 mov***(文字因故被系统屏蔽)***(文字因故被系统屏蔽) 可以移动 8 位字节串。

  汇编跳转和调用
  汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用 near 或 far 前缀可以替代这样的跳转或调用,如下例所示:
  -a0100:0500
  0100:0500 jmp 502 ; a 2-byte short jump
  0100:0502 jmp near 505 ; a 3-byte near jump
  0100:0505 jmp far 50a ; a 5-byte far jump
  可以将 near 前缀缩写为 ne。

  区分字和字节内存位置
  当某个操作数可以引用某个字内存位置或者字节内存位置时,必须用前缀 word ptr 或者前缀 byte ptr 指定数据类型。可接受的缩写分别是 wo 和 by。以下范例显示两种格式:
  dec wo [si]
  neg byte ptr [128]

  指定操作数
  Debug 使用包括在中括号 ([ ]) 的操作数引用内存地址的习惯用法。这是因为另一方面 Debug 不能区分立即操作数和内存地址的操作数。以下范例显示两种格式:
  mov ax,21 ; load AX with 21h
  mov ax,[21] ; load AX with the
  ; contents of
  ; memory location 21h

  使用伪指令
  使用 a 命令提供两个常用的伪指令:db 操作码,将字节值直接汇编到内存,dw 操作码,将字值直接汇编到内存。以下是两个伪指令的范例:
  db 1,2,3,4,"THIS IS AN EXAMPLE"
  db THIS IS A QUOTATION MARK:"
  db "THIS IS A QUOTATION MARK:"
  dw 1000,2000,3000,"BACH"
  ++