DEBUG的基本命令的使用[MASM]
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:偏移地址),在其后输入汇编指令,回车后可输入下一条指令,直接回车则退出输入
DEBUG的基本命令的使用[MASM]的更多相关文章
- 汇编基础知识之二debug的使用
DEBUG的使用 (要在win32位习题下进行,win7 64位需要安装DosBox和debug这2个软件): 1:win64位下debug的使用教程: 下载debug.exe,这里我把debug放在 ...
- debug 在windows下的使用
debug是什么? debug是一款windows和DOS系统下的一款软件,其最早可追溯到1937年的"马克1号"(具体度娘):早期debug主要在DOS和windows系统中,它 ...
- perl 脚本测试
原文地址: http://blog.csdn.net/johnny710vip/article/details/8905239 这是一篇关于perl脚本测试的总结性文章,其中提到了很多实用的 ...
- 关于64位W7下怎么学习汇编语言的一些心得!
出处:http://tieba.baidu.com/p/2277546332 1.首先下载DOSBOX,它的作用就是让你在64位下使用32.16位的软件.如果不使用DOSBOX就会出现程序不兼容的对话 ...
- jmeter sampler maven项目排错记
eclipse 创建的maven项目,引入jar包之后出现红色叹号,一直找不到原因,连main方法都无法运行,提示找不到类: 错误: 找不到或无法加载主类 soapsampler.SoapSample ...
- 汇编debug与masm命令
汇编语言这块是我之前写在网易博客上的,不过那个账号基本已经作废了,所以现在抽个时间把当时的博客搬到CSDN上. 汇编命令(编译器masm命令):找到masm所在的文件夹,我的在d:\MASM中,用cm ...
- 向 wmware workstation pro 的 MS-DOS 操作系统中导入文件(masm debug edit)(详细图解)
一般MS-DOS中不包含masm.debug和edit这三个程序. 我们想要把这几个文件导入到wmware workstation pro中的DOS虚拟机中怎么做呢? [尝试] 1.我试过用共享文件夹 ...
- Debug和汇编编译器masm对指令的不同处理
我们在Debug和源程序中写入同样形式的指令 : "mov al,[0]","mov bl,[1]","mov cl,[2]"," ...
- masm的调试命令(debug)
-u命令:查看汇编代码: -t命令:执行下一条语句 -g + 的内存:跳转到该内存所对应的语句(再用t命令执行该条命令) -r命令:查看寄存器的内容(后可直接接寄存器的名称,就只查看该寄存器的内容) ...
随机推荐
- LInux内核配置过程
内核版本 linux 2.6.32.2 配置内核的过程 配置内核可以通过执行 make menuconfig 来进行,下面分析该命令的执行流程 执行该目标 %config: scripts_basic ...
- jquery查出元素名称
<div onclick='$(this).prop("tagName")'></div> 最后的结果 DIV
- JavaFX如何为按钮设置快捷键?
JavaFX为按钮设置快捷键的方式有很多,先说下常见的一种. 第一种: KeyCodeCombination kc1 = new KeyCodeCombination(KeyCode.W, KeyCo ...
- 61-如何使用 Weave 网络?
weave 是 Weaveworks 开发的容器网络解决方案.weave 创建的虚拟网络可以将部署在多个主机上的容器连接起来.对容器来说,weave 就像一个巨大的以太网交换机,所有容器都被接入这个交 ...
- Java并发的若干基本陷阱、原理及解决方案
勿止于结论:持续探索与求证. 概述 为什么要使用并发 ? 有三点足够信服的理由: 性能提升.单核 CPU 的性能基本抵达瓶颈,充分挖掘多核 CPU 的能力,使得性能提升变成水平可扩展的. 事件本质.世 ...
- CSS(3)---块级标签、行内标签、行内块标签
块级标签.行内标签.行内块标签 html中的标签元素三种类型:块级标签.行内标签.行内块标签. 一.概述 1.块级标签 概念 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度.高度.对齐等属 ...
- c++11 auto 与auto& 遍历vector区别
目录 说明 c++11 auto 与auto& 遍历区别 今天被这个问题坑了一天,一直以为是算法错了,debug了一天,最后暴力生成数据才发现,测试代码如下: 说明 转载请注明出处:https ...
- VC遍历访问目录下的文件
访问目录文件夹下的文件是经常需要的操作,C/C++和win32接口都没有提供直接调用的函数.在这里总结了几个经常用到的函数,通过MFC的CFileFind函数递归遍历实现,包括以下几个功能函数: 查找 ...
- Android lifecyle 源码解剖 - gdutxiaoxu的博客(微信公众号 stormjun94)
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/gdutxiaoxu/article/det ...
- Oracle GoldenGate常用参数详解
Oracle GoldenGate常用参数详解http://blog.itpub.net/28389881/viewspace-2564461/