Debug使用指南Word文档格式.docx
《Debug使用指南Word文档格式.docx》由会员分享,可在线阅读,更多相关《Debug使用指南Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
![Debug使用指南Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/23/ee39e160-b3d0-4551-8abb-3460324f6811/ee39e160-b3d0-4551-8abb-3460324f68111.gif)
s
在部分内存中搜索一个或多个字节值的模式。
t
执行一条指令,然后显示所有寄存器的内容、所有标志的状态和
下一步要执
行的指令的解码形式。
u
反汇编字节并显示相应的原语句。
将被测试文件写入磁盘。
xa
分配扩展内存。
xd
释放扩展内存。
xm
映射扩展内存页。
xs
显示扩展内存的状态。
标志位的状态表示
=====================================================================分隔命令参数
所有
命令都接受参数,除了
命令之外。
可以用逗号或空格分隔参数,但是只有在两个十六进制值之间才需要这些分隔符。
因此,以下命令等价:
dcs:
100
110
d
cs:
d,cs:
100,110
=====================================================================指定有效地址项
Debug
命令中的
address
参数指定内存位置。
Address
是一个包含字母段记录的二位名称或一个四位字段地址加上一个偏移量。
可以忽略段寄存器或段地址。
a,g,l,t,u
和
命令的默认段是
CS。
所有其他命令的默认段是
DS。
所有数值均为十六进制格式。
有效地址如下:
在段名和偏移量之间要有冒号
CS:
0100
04BA:
======================================================================指定有效范围项
range
参数指定了内存的范围。
可以为
选择两种格式:
起始地址和结束地址,或者起始地址和长度范围(由字母
L表示)。
例如,下面的两个语法都可以指定从
CS:
开始的
16
字节范围:
10f
L10
Debug子命令
Debug:
A(汇编)
直接将
记忆码合并到内存。
该命令从汇编语言语句创建可执行的机器码。
所有数值都是十六进制格式,必须按一到四个字符输入这些数值。
在引用的操作代码(操作码)前指定前缀记忆码。
a
[address]
参数
address
指定键入汇编语言指令的位置。
对
使用十六进制值,并键入不以“h”字符结尾的每个值。
如果不指定地址,a
将在它上次停止处开始汇编。
范例
add
bx,34[bp+2].[si-1]
pop
[bp+di]
push
[si]
还支持所有操作码同义词,如下例所示:
loopz
loope
ja
200
jnbe
-a0100:
0500
0100:
jmp
502
;
2-byte
short
jump
0502
near
505
3-byte
0505
far
50a
5-byte
使用伪指令
命令提供两个常用的伪指令:
db
操作码,将字节值直接汇编到内存,
dw
操作码,将字值直接汇编到内存。
以下是两个伪指令的范例:
1,2,3,4,"
THIS
IS
AN
EXAMPLE"
A
QUOTATION
MARK:
"
1000,2000,3000,"
BACH"
===================================================================
C(比较)
range
指定要比较的内存第一个区域的起始和结束地址,或起始地址和长度。
指定要比较的第二个内存区域的起始地址。
以下命令具有相同效果:
c100,107300
c100L8
300
每个命令都对
100h
到
10Fh
的内存数据块与
300h
30Fh
的内存数据块进行比较。
响应前面的命令并显示如下信息(假定
DS
=
197F):
197F:
4D
E4
197F:
0300
0101
67
99
0301
0102
A3
27
0302
0103
35
F3
0303
0104
97
BD
0304
0105
04
0305
0107
76
71
0307
注意:
列表中缺少地址
0106
0306。
这表明那些地址中的值是相同的。
如果
内存区域相同,Debug
将不显示任何内容而直接返回到
提示符。
如果有差异,Debug
将按如下格式显示:
address1byte1
byte2
addess2
Debugd(转储)
显示一定范围内存地址的内容。
[range]
指定要显示其内容的内存区域的起始和结束地址,或起始地址和长度。
如果不指定
range,Debug
程序将从以前
命令中所指定的地址范围的末尾开始显
示
128
个字节的内容。
范例
10f
按以下格式显示范围中的内容:
54
4F
00
53
41
57
59-45
52
TOM.SAWYER......
如果在没有参数的情况下键入
命令,Debug
按以前范例中所描述的内容来编排显示格式。
显示的每行以比前一行的地址大
个字节(如果是显示
40
列的屏幕,则为
8
个字节)的地址开头。
对于后面键入的每个不带参数的
将紧接在最后显示的命令后立即显示字节内容。
dcs:
100
L
20
将从
开始显示
20h
个字节的内容:
115
将显示范围从
CS
段的
115h
中所有字节的内容:
当使用
命令时,Debug
以两个部分显示内存内容:
十六进制部分(每个字节的值都用十六进制格式表示)和
ASCII
码部分(每个字节的值都用
码字符表示)。
每个非打印字符在显示的
部分由句号
(.)
表示。
每个显示行显示
字节的内容,第
字节和第
9
字节之间有一个连字符。
每个显示行从
字节的边界上开始。
=====================================================================Debug:
E(键入)
将数据输入到内存中指定的地址。
可以按十六进制或
格式键入数据。
以前存储在指定位置的任何数据全部丢失。
e
指定输入数据的第一个内存位置。
list
指定要输入到内存的连续字节中的数据。
ecs:
按下面的格式显示第一个字节的内容:
EB.
要将该值更改为
41,请在插入点键入
41,如下所示:
EB.41_
可以用一个
命令键入连续的字节值。
在键入新值后按
SPACEBAR(空格键),而不是按
ENTER
键。
显示下一个值。
在此范例中,如果按三次
SPACEBAR(空格键),Debug
将显示下面的值:
EB.41
10.
00.
BC._
要将十六进制值
BC
更改为
42,请在插入点键入
42,如下所示:
EB.41
10.
00.
BC.42_
假定决定值
10
应该是
6F。
要纠正该值,请按
HYPHEN
键(-)两次以返回到地址
0101(值
10)。
显示以下内容:
0100
EB.41
00.
BC.42-
00.-
10._
在插入点键入
6f
更改值,如下所示:
10.6f_
按
停止
命令并返回到
提示符下。
以下是字符串项的范例:
eds:
This
is
the
text
example"
该字符串将从
DS:
开始填充
24
个字节。
如果在没有指定可选的
参数的值情况下指定
的值,Debug
将显示地址和内容,在下一行重复地址,并等待您的输入。
此时,您可以执行下列操作之一:
替换字节值。
为此,请在当前值后键入新值。
如果您键入的值不是有效的十六进制值,或该值包含两个以上的数字,则
不会回显无效或额外的字符。
进入下一个字节。
为此,请按
SPACEBAR(空格键)。
要更改该字节中的值,请在当前值后键入新值。
如果按
SPACEBAR(空格键)时,移动超过了
位界限,Debug
程序将显示新的一行并在行首显示新地址。
返回到前一个字节。
键
可以反复按
(-)
向后移动超过多个字节。
在按
时,Debug
开始新行并显示当前地址和字节值。
停止执行
命令。
在任何字节位置都可以按
ENTER。
如果指定
参数的值,随后的
命令将使用列表中的值替换现有的字节值。
如果发生错误,将不更改任何字节值。
List
值可以是十六进制字节或字符串。
使用空格、逗号或制表符来分隔值。
必须将字符串包括在单或双引号中。
F(填充)
使用指定的值填充指定内存区域中的地址。
可以指定十六进制或
格式表示的数据。
任何以前存储在指定位置的数据将会丢失。
f
range
指定要填充内存区域的起始和结束地址,或起始地址和长度。
指定要输入的数据。
可以由十六进制数或引号包括起来的字符串组成。
f04ba:
100L100
42
45
52
54
作为响应,Debug
使用指定的值填充从
04BA:
1FF
的内存位置。
重复这五个值直到
个字节全部填满为止。
如果
包含的字节数比
中的数值大,Debug
将在
中反复指派值,直到
中的所有字节全部填充。
如果在
中的任何内存损坏或不存在,Debug
将显示错误消息并停止
包含的数值多于
中的字节数,Debug
将忽略
中额外的值。
G(转向)
运行当前在内存中的程序。
g
[=address]
[breakpoints]
=address
指定当前在内存中要开始执行的程序地址。
address,Windows
2000
IP
寄存器中的当前地址开始执行程序。
breakpoints
指定可以设置为
命令的部分的
个临时断点。
gcs:
7550
Windows
运行当前内存中的程序,直到执行到
段中的断点地址
为止。
将显示寄存器的内容和标志的状态并结束
gcs:
7550,
8000
命令设置两个断点:
遇到断点之后再次键入
命令,将从在断点之后的指令开始执行,而不是在通常的开始地址执行。
必须在
参数之前使用等号
(=)
以区分开始地址
(address)
和断点地址
(breakpoints)。
程序在它遇到的第一个断点处停止,而不论您在
breakpoint
列表的什么位置键入断点。
在每个断点处用中断代码代替原始指令。
当程序到达断点时,Debug
将所有断点地址恢复到它们的最初指令并显示所有寄存器的内容、所有标记的状态以及最后执行指令的解码形式。
显示的信息与使用
r(寄存器)命令并指定断点时所显示的信息相同。
如果不在断点处停止程序,Debug
程序将不使用原始指令替换中断代码。
可以只在包含
8086
操作代码(操作码)的第一个字节的地址上设置断点。
如果设置了
个以上的断点,Debug
将显示以下信息:
bp
error
H(十六进制)
对指定的两个参数执行十六进制运算。
h
value1
value2
value1
代表从
0
FFFFh
范围内的任何十六进制数字。
value2
范围内第二个十六进制数字。
h19f
10a
执行运算并显示以下结果。
02A9
0095
首先将指定的两个参数相加,然后从第一个参数中减去第二个参数。
这些计算的结果显示在一行中:
先计算和,然后计算差。
I(输入)
从指定的端口读取并显示一个字节值。
i
port
按地址指定输入端口。
地址可以是
位的值。
i2f8
同时假定端口的字节值是
42h。
读取该字节,并将其值显示如下:
42
L(加载)
将某个文件或特定磁盘扇区的内容加载到内存。
要从磁盘文件加载
BX:
CX
寄存器中指定的字节数内容,请使用以下语法:
[address]
要略过
Windows
文件系统并直接加载特定的扇区,请使用以下语法:
drive
start
number
指定要在其中加载文件或扇区内容的内存位置。
address,Debug
将使用
寄存器中的当前地址。
drive
指定包含读取指定扇区的磁盘的驱动器。
该值是数值型:
A,
B,
2
C
等。
start
指定要加载其内容的第一个扇区的十六进制数。
指定要加载其内容的连续扇区的十六进制数。
只有要加载特定扇区的内容而不是加载
debug
命令行或最近的
n(名称)命
令中指定的文件时,才能使用
drive、start
参数。
现在可以键入
命令以加载
F。
将加载文件并显示
假定需要从驱动器
将起始逻辑扇区为
15
(0Fh)
的
109
(6Dh)
个扇区的内容加载到起始地址为
的内存中。
为此,请键入以下命令:
l04ba:
2
0f
6d
注意
当使用不带参数的
L
命令时,在
命令行上指定的文件将加载到内存中,从地址
开始。
同时将
BX
寄存器设置为加载的字节数。
如果不在
命令行指定文件,所装入的文件将是最近使用
n
命令经常指定的文件。
如果使用带
参数的
将从内存位置
开始加载文件或指定扇区的内容。
如果使用带所有参数的
将加载指定磁盘扇区的内容而不是加载文件。
指定范围内的每个扇区均从
读取。
从
开始加载,直到在
中指定的扇区数中的内容全部被加载。
加载
.exe
文件
忽略
文件的地址
如果指定
文件,Debug
将文件重新定位到
文件的标题中指定的加载地址。
在
文件被加载到内存前,标题自身从
文件脱离,因此磁盘上的
文件大小与内存中的不同。
如果要检查整个
文件,请使用不同的扩展名重命名文件。
打开十六进制文件
将具有
.hex
扩展名的文件认为十六进制格式文件。
键入不带参数的
命令,可以加载从十六进制文件中指定的地址处开始的十六进制文件。
如果键入的
命令包含
参数,Debug
将把指定的地址加到在十六进制文件中找到的地址上,以确定起始地址。
======================================================================Debug:
M(移动)
将一个内存块中的内容复制到另一个内存块中。
m
指定要复制内容的内存区域的起始和结束地址,或起始地址和长度。
指定要将
内容复制到该位置的起始地址。
mcs:
500
首先将
地址中的内容复制到地址
510
中,然后将
10F
地址中的内容复制到
50F
中,如此操作直至将
中。
要查看结果,请使用
d(转储)命令,并使用
命令指定目标地址。
复制操作对现有数据的影响
如果新数据没有写入正在被复制的数据块中的地址,则源数据将保持不变。
但是,如果目标块已经包含数据(就象它在覆盖副本操作中一样),则将改写该数据。
(覆盖复制操作是指那些目标数据块部分内容覆盖原数据块部分内容的操作。
)
执行覆盖复制操作
命令执行目标地址的覆盖复制操作,而不丢失数据。
将改写的地址内容首先复制。
因此,如果将较高位地址的数据复制到较低位地址,则复制操作从原块的最低位地址开始并向最高位地址进行。
反之,如果要将数据从低地址复制到高地址,复制操作从原块的最高地址开始,向最低地址进行。
N(名称)
指定
l(加载)或
w(写入)命令的可执行文件的名称,或者指定正在调试的可执行文件的参数。
n
要指定测试的可执行文件的参数,请使用以下语法: