DEBUG的基本命令的使用

DEBUG是专门为汇编语言设计的一种调试工具,它通过步进,设置断点等方式为汇编语言程序员提供了非常有效的调试手段。

DEBUG的命令都是一个字母,后跟一个或多个参数:字母 [参数]

命令的使用中注意:

① 字母不分大小写;

② 只使用16进制数,没有后缀字母;

③ 分隔符(空格或逗号)只在两个数值之间是必须的,命令和参数间可无分隔符;

④ 每个命令只有按了回车键后才有效,可以用Ctrl+Break中止命令的执行;

⑤ 命令如果不符合Debug的规则,则将以“error”提示,并用“^”指示错误位置。

许多命令的参数是主存逻辑地址,形式是“段基地址 : 偏移地址”。其中,段基地址可以是段寄存器或数值;偏移地址是数值。如果不输入段地址,则采用默认值,可以是缺省段寄存器值。如果没有提供偏移地址,则通常就是当前偏移地址。

对主存操作的命令还支持地址范围这种参数,它的形式是:“开始地址 结束地址”(结束地址不能具有段地址),或者是:“开始地址 L字节长度”。

DEBUG命令一览:

分类

命令格式

功能简介

读写寄存器

R

显示所有寄存器的当前内容

R寄存器名

显示和修改指定寄存器内容

RF

显示和修改标志寄存器内容

汇编和反汇编

A[内存地址]

从指定地址开始汇编指令

U[内存块]

对指定内存块进行反汇编

执行指令

T[:内存地址][条数]

单步或多步执行指令(进入过程)

P[=内存地址][条数]

单步或多步执行指令(不进入过程)

G[=内存地址]

连续执行指令

G[=内存地址]断点地址

设断点执行程序

读写内存

D[内存块]

显示指定内存块内容

E 内存地址 字符或数值串

修改指定内存内容

F 内存块 字符或数值串

填充指定内存块

S 内存块 字符串或数值

在指定内存块中查找串

M 内存块1 内存块2的首地址

复制内存块内容

C 内存块1 内存块2的首地址

比较两个指定内存块

读写磁盘

N[d:][path]文件名.扩展名

指定欲读写的磁盘文件

W 内存地址

将指定内存块写入文件

L [内存地址]

将文件调入内存

读写I/O端口

I 端口地址

读入指定端口的内容

O 端口地址  数值

将数据写入指定端口

十六进制加减

H 数值1 数值2

计算并显示两数之和,两数之差

退出DEBUG

Q

退出DEBUG,返回DOS

1、DEBUG程序的启动

在DOS提示符下,可键入命令:

C:\>DEBUG↙

DEBUG命令的完整格式为:DEBUG [d:][path][文件名][ 参数1][参数2]。其中[d:]是盘符,[path]是路径,文件名是被调试文件的名称,它须是执行文件(EXE),两个参数是运行被调试文件时所需要的命令参数,在DEBUG程序调入后,出现提示符“-”,此时,可键入所需的DEBUG命令。

在启动DEBUG时,如果输入了文件名,则DEBUG程序把指定文件装入内存。用户可以通过DEBUG的命令对指定文件进行修改、显示和执行。如果没有文件名,则是以当前内存的内容工作,或者用命名命令和装入命令把需要的文件装入内存,然后再用DEBUG的命令进行修改、显示和执行。

2、DEBUG的主要命令

(1)、检查和修改寄存器内容的命令R,它有三种方式:

1)显示CPU内部所有寄存器内容和标志位状态,格式为:-R

例如:输入-R↙,得到结果如下:

2)显示和修改某个指定寄存器内容,格式为:-R 寄存器名

例如:输入-R AX,得到结果如下:

表示AX当前内容为0000,此时若不对其作修改,可按ENTER键,否则,输入修改内容后,如:

则AX内容由0000改为0A0A

3)R命令显示标志寄存器标志位状态的含义如下表所示:

标 志 名

置  位(值为1)

复  位(值为0)

溢出Overflow(是/否)

OV

NV

方向Direction(减量/增量)

DN

UP

中断Interrupt(允许/屏蔽)

EI

DI

符号Sign(负/正)

NG

PL

零Zero(是/否)

ZR

NZ

辅助进位Auxiliary Carry(是/否)

AC

NA

奇偶Parity(偶/奇)

PE

PO

进位Carry(是/否)

CY

NC

修改标志位状态,命令格式为:-RF

例如:输入-RF,输出结果如下:

这时若不作修改可按ENTER键,否则在“-”号之后键入修改值,键入顺序任意。如:

(2)、汇编命令A,格式为:-A[地址]

该命令从指定地址开始允许输入汇编语句,把它们汇编成机器代码相继存放在从指定地址开始的存储器中。A命令中如果没有指定地址,则接着上一个A命令的最后一个单元开始;若还没有使用过A命令,则从当前CS : IP开始。

例如:输入代码,则代码存储在OAFO:0100至OAFO:010D单元中。

(3)、反汇编命令U,有两种格式:

1)-U[地址]

该命令从指定地址开始,反汇编32个字节,若地址省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。

2)-U范围

该命令对指定范围的内存单元进行反汇编,例如:

-U 0100 011E或-U 100 11E 或-U 0AF0:0100 011E或–U 0AF0:0100 L1F(L用来引导指令的条数,1F为指令的条数),这些命令是等效的。

(4)、运行命令G,格式为:

-G [=地址1][地址2]

其中地址1规定了运行起始地址,后面的地址为断点地址。若省略地址,则运行从IP所指的地址开始。例如:

(5)、追踪命令T,有两种格式:

1)逐条指令追踪:

-T

该命令从指定地址起执行一条指令后停下来,显示寄存器内容和状态值。例如:

2)多条指令追踪:(有问题)

-T[=地址][值]

该命令从指定地址起执行n条命令后停下来,n由[值]确定。

(6)、显示内存单元内容的命令D,格式为:

-D[地址](从给出的地址开始连续显示128个字节的单元内容)或-D[范围],例如:

(7)、修改内存单元内容的命令E,它有两种格式:

1)用给定的内容代替指定范围的单元内容:

-E地址  内容表

例如:-E 2000:0100  F3 “XYZ” 8D

其中F3,“X”“Y”“Z”和8D各占一个字节,用这五个字节代替原内存单元2000:0100到0104的内容,“X”“Y”“Z”将分别按它们的ASCII码值代入。

2)逐个单元相继地修改:

-E地址

例如:-E 100:

0AF0:0100 F3.E7

此命令是将原100号单元的内容F3改为E7。E7是键入值。

(8)、命名命令N,格式为:

-N 文件名

此命令将文件名格式化在CS:5CH的文件控制块内,以便使用L或W命令把文件装入内存进行调试或者存盘。例如:

(9)、装入命令L,它有两种功能:

1)把磁盘上指定扇区的内容装入到内存指定地址起始的单元中,格式为:

-L  地址  驱动器  扇区号  扇区个数

2)装入指定文件,格式为:

-L [地址]

此命令装入已在CS:5CH中格式化的文件控制块所指定的文件。

在用L命令前,BX和CX中应包含所读文件的字节数。

3)装入已在文件控制块中的文件,格式为:

-L

此命令与-L [地址]相同功能。

(10)、写命令W,有两种格式:

1)把数据写入磁盘的指定扇区:

-W  地址  驱动器  扇区号  扇区数

2)把数据写入指定文件中:

-W  [地址]

此命令把指定内存区域中的数据写入由CS:5CH处的FCB所规定的文件中。在用W命令前,BX和CX中应包含要写入文件的字节数。

(11)、十六进制运算命令H,格式为:

-H [数据1] [数据2]

其功能是将两个十六进制数进行相加、相减运算,结果显示在屏幕上。例如:

(12)、退出DEBUG命令Q,该命令格式为:

-Q

它退出DEBUG程序,返回DOS,但该命令本身并不把在内存中的文件存盘,如需存盘,应在执行Q命令前先执行写命令W。

附二.DEBUG32的重要扩展命令的使用

(1)、R16/R32更换寄存器显示位数命令

  R16 设置 16 bit 显示模式

  R32设置 32 bit 显示模式

(2)CLS清屏命令

D 查看数据内容指令:

D 命令——查看内存单元

前面我们学到,内存每 16 个字节单元为一小段,逻辑段必须从小段的首址开始。用 D 命令可以查看存储单元的地址和内容。

D 命令格式为:

D  段地址:起始偏移地址 [结尾偏移地址] [L范围]

例如:

D DS:      查看数据段,从  号单元开始
D ES: 查看附加段,从 号单元开始
D DS: 查看数据段,从 100H 号单元开始
D : 查看 0200H 段的 号单元到 15H 号单元(在虚拟机上该命令不能执行)
D : L 用 L 选择范围。查看 0200H 段的 号单元到 15H 号单元共 个单元

图中第一条 D 命令显示的是数据段存储单元的内容,可以看到数据段的段地址为 DS,其值 0B05H。0 号单元的内容为 CDH,1 号单元为 20H ,...,第 15 号单元的内容为 03H;第二行 0010H 号(16 号)单元的内容为 69H,它是小写字母 i 的 ASCII 码,因此右边区域中显示了 i ,表示该单元的值 69H 可以看成 ASCII 码。

第二条 D 命令显示 0200H 段中的内容,也是从 0 号单元开始。

第三条 D 命令从 0200H 段的 5 号单元开始显示直到 15H 号单元。

如果在 D 后面直接写出偏移地址,则显示当前数据段下偏移地址开始的内存单元,如:

D 10        从数据段10H号单元开始显示
D100 从数据段100H号单元开始显示

注意:多次键入 D,可连续显示后面的单元内容

用 D DS:0 命令显示后,可以看到,这三个单元的值由原来的 9F 00 9A 修改为 14 15 16。

如果 E 后面直接跟偏移地址,则修改当前数据段下偏移地址所指单元值;还可以用 E 命令修改其它段的存储单元内容。

E 10        修改当前数据段10H号单元内容
E ES:100 修改附加段100H号单元内容
D ES:100 查看一下100H单元的内容是否修改了

U 后跟偏移地址,则从该地址开始反汇编。如:

U 0       从代码段0号单元开始反汇编
U100 从代码段100H号单元开始反汇编

需要注意的是,图 2-22 中显示的程序代码并不是用户编写的程序,因为在输入 DEBUG 命令时没有写用户程序名.EXE。这段程序代码是系统代码段中保存的内容,有可能是系统程序,也有可能是无效的代码。

(5)A 命令——输入汇编指令

在 DEBUG 中,使用 A 命令可以输入汇编指令,系统自动地将键入的汇编指令翻译成机器代码,并相继地存放在从指定地址开始的存储区中。由于 DEBUG 下的数值默认为十六进制数,因此先要将十进制数转换成十六进制数。

例如,第 1 章提到的计算 Z = 35 + 27 的汇编指令为:

MOV  AX,23H
ADD AX,1BH
MOV [0000],AX

加法的结果 Z=62=3EH。变量 Z 用存储单元[0000]表示。这三条指令可在 DEBUG 下用 A 命令直接输入。输入 A 命令后,系统自动地给出逻辑地址为 0AEE:0100(CS:偏移地址),在其后输入汇编指令,回车后可输入下一条指令,直接回车则退出输入

最新文章

  1. hihoCoder#1039
  2. javascript操控浏览器
  3. 缓存工具CacheUtil - 并发环境的缓存值存取
  4. android自定义圆形图片和遇到的问题
  5. NPOI导出word,以及对table的一些设置
  6. 【产品体验】eyepetizer开眼
  7. bzoj 3527: [Zjoi2014]力 快速傅里叶变换
  8. hdoj 1010 Tempter of the Bone【dfs查找能否在规定步数时从起点到达终点】【奇偶剪枝】
  9. C#获取设备的IP和Mac类
  10. include指令和include动作
  11. 1.2 decimal模块
  12. QWebSocket 客户端
  13. 2. React JSX语法及特点介绍
  14. VIM编辑常用命令
  15. 用TSQL从sqlserve 发布订阅链中删除一张或几张表
  16. jsp中的JSTL与EL表达式用法及区别
  17. javaweb项目中的过滤器的使用
  18. Docker Secrets
  19. Windows Server 2008 R2下将JBoss安装成windows系统服务
  20. mysql & vs2013

热门文章

  1. Redis sorted set 常用命令介绍
  2. 手动启动Oracle服务的.bat文件
  3. C#通过WMI获取硬件信息
  4. 用正则表达式【regexp】进行高级搜索数据
  5. Mysql数据库的主从与主主
  6. 人员简历管理系统-毕业设计(包括文档+源代码+答辩PPT)
  7. Django-Model 大全
  8. Microsemi Libero使用技巧——使用FlashPro生成stp程序文件
  9. 3. abp依赖注入的分析.md
  10. FCC---CSS Flexbox: Apply the flex-direction Property to Create a Column in the Tweet Embed