实验二Debug的使用1.docx
《实验二Debug的使用1.docx》由会员分享,可在线阅读,更多相关《实验二Debug的使用1.docx(11页珍藏版)》请在冰豆网上搜索。
![实验二Debug的使用1.docx](https://file1.bdocx.com/fileroot1/2022-12/14/93af3261-bad2-4e7c-a092-cab3cad23341/93af3261-bad2-4e7c-a092-cab3cad233411.gif)
实验二Debug的使用1
实验二Debug的使用
(一)
一、实验要求和目的
1.熟悉Debug环境。
2.掌握常用Debug命令的基本操作。
二、软硬件环境
1.硬件环境:
微机CPU486以上,500MB以上硬盘,32M以上内存;
2.软件环境:
装有MASM5.0、DEBUG、LINK和EDIT等应用程序。
三、实验涉及的主要知识单元
在以后所有的实验中,都将用到Debug程序,首先学习一下它的主要用法。
(1)什么是Debug?
Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。
使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
(2)我们用到的Debug功能
●用Debug的R命令查看、改变CPU寄存器的内容;
●用Debug的D命令查看内存中的内容;
●用Debug的E命令改写内存中的内容;
●用Debug的U命令将内存中的机器指令翻译成汇编指令;
●用Debug的T命令执行一条机器指令;
●用Debug的A命令以汇编指令的格式在内存中写入一条机器指令。
Debug的命令比较多,共有20多个,但上述6个命令是和汇编语言学习密切相关的。
在以后的实验中,我们还会用到一个P命令。
(3)进入Debug
Debug是在DOS方式下使用的程序。
我们在进入Debug前,应先进入到DOS方式。
用以下方式可以进入DOS:
①重新启动计算机,进入DOS方式,此时进入的是实模式的DOS。
②在Windows中进入DOS方式,此时进入的是虚拟8086模式的DOS。
下面说明在WindowsXP中进入Debug的一种方法,在Windows98中进入的方法与此类似。
单击【开始】菜单中的【运行】命令,打开【运行】对话框,在文本框中输入“command”后,单击【确定】按钮。
图2-1选择【运行】命令图2-2在文本框中输入“command”
进入DOS方式后,如果显示为窗口方式,可以按下Alt+Enter键将窗口变为全屏方式。
然后运行Debug程序,如图2-3所示,这个程序在Windows98中通常在C:
\windows98\command下,在WindowsXP中通常在C:
\winnt\system下。
由于系统指定了搜索路径,所以在任何一个路径中都可以运行。
图2-3运行Debug程序
(4)用R命令查看、改变CPU寄存器的内容
我们已知道了AX、BX、CX、DX、CS、IP这6个寄存器,现在看一下它们之中的内容,如图2-4所示。
其他寄存器SP、BP、SI、DI、DS、ES、SS、标志寄存器等先不予理会。
图2-4使用R命令查看CPU中各个寄存器中的内容
注意CS和IP的值,CS=0CA2,IP=0100,也就是说,内存0CA2:
0100处的指令为CPU当前要读取、执行的指令。
在所有寄存器的下方,Debug还列出了CS:
IP所指向的内存单元处所存放的机器码,并将它翻译为汇编指令。
可以看到,CS:
IP所指向的内存单元为0CA2:
0100,此处存放的机器码为027548,对应的汇编指令为ADDDH,[DI+48](这条指令的含义先不必深究)。
还可以用R命令来改变寄存器中的内容,如图2-5所示。
图2-5用R命令修改寄存器AX中的内容
若要修改一个寄存器中的值,比如AX中的值,可用R命令后加寄存器名来进行,输入“rax”后按Enter键,将出现“:
”作为输入提示,在后面输入要写入的数据后按Enter键,即完成了对AX中内容的修改。
若想看一下修改的结果,可再用R命令查看,如图2-6所示。
图2-6用R命令修改CS和IP中的内容
在图2-6中,一进入Debug,用R命令查看,CS:
IP指向0B39:
0100,此处存放的机器码为40,对应的汇编指令是INCAX;
接着,用R命令将IP修改为200,则CS:
IP指向0B39:
0200,此处存放的机器码为5B,对应的汇编指令是POPBX;
接着,用R命令将CS修改为ff00,则CS:
IP指向ff00:
0200,此处存放的机器码为51,对应的汇编指令是PUSHCX。
(5)用Debug的D命令查看内存中的内容
用Debug的D命令,可以查看内存中的内容,D命令的格式较多,我们这里只介绍在本次实验中用到的格式。
如果想知道内存10000H处的内容,可以用“d段地址:
偏移地址”的格式来查看,如图2-7所示。
图2-7用D命令查看内存1000:
0处的内容
要查看内存10000H处的内容,首先将这个地址表示为段地址:
偏移地址的格式,可以是1000:
0,然后用“d1000:
0”列出1000:
0处的内容。
使用“d段地址:
偏移地址”的格式,Debug将列出从指定内存单元开始的128个内存单元的内容。
图2-7中,在使用d1000:
0后,Debug列出了1000:
0~1000:
7F中的内容。
使用D命令,Debug将输出3部分内容,如图2-7所示。
①中间是部分从指定地址开始的128个内存单元的内容,用十六进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。
从图中,我们可以知道,内存1000:
0单元中的内容是72H,内存1000:
1单元中的内容是64H;内存1000:
0~1000:
F中的内容都在第一行;内存1000:
10中的内容是6D,内存1000:
1处的内容是61;内存1000:
10~1000:
1F中的内容都在第二行。
注意在每行的中间有一个“-”,它将每行的输出分为两部分,这样便于查看。
比如,要想从图中找出,1000:
6B单元中内容,可以从1000:
60找到行,“-”前面是1000:
60~1000:
67的8个单元,后面是1000:
68~1000:
6F的8个单元,这样我们就可以从1000:
68单元向后数3个单元,找到1000:
6B单元,可以看到,1000:
6B中的内容为67H。
②左边是每行的起始地址。
③右边是每个内存单元中的数据对应的可显示的ASCII码字符。
比如:
内存单元1000:
0、1000:
1、1000:
2中存放的数据是72H、64H、73H,它对应的ASCII字符分别是“r”、“d”、“s”;内存单元1000:
36中的数据是0AH,它没有对应可显示的ASCII字符,Debug就用“.”来代替。
注意:
我们看到的内存中的内容,在不同的计算机中是不一样的,也可能每次用Debug看到的内容都不相同,因为我们用Debug看到的都是原来就在内存中的内容,这些内容受随时都有可能变化的系统环境的影响。
当然,我们也可以改变内存、寄存器中的内容。
使用d1000:
9查看1000:
9处的内容,Debug将怎样输出呢?
如图2-8所示。
图2-8查看1000:
9处的内容
Debug从1000:
9开始显示,一直到1000:
88,一共是128个字节。
第一行中的1000:
0~1000:
8单元中的内容不显示。
在一进入Debug后,用D命令直接查看,将列出Debug预设的地址处的内容,如图2-9所示。
在使用“d段地址:
偏移地址”之后,接着使用D命令,可列出后续的内容,如图2-10所示。
图2-9列出Debug预设的地址处的内容
图2-10列出后续的内容
也可以用指定D命令的查看范围,此时采用“d段地址:
起始偏移地址结尾偏移地址”的格式。
比如要看1000:
0~1000:
9中的内容,可以用“d1000:
09”实现。
如图2-11所示。
图2-11查看1000:
0~1000:
9单元中的内容
如果我们就想查看内存单元10000H中的内容,可以用图2-12中的任何一种方法看到,因为图中的所有“段地址:
偏移地址”都表示了10000H这一物理地址。
图2-12用三种不同的段地址和偏移地址查看同一个物理地址中的内容
(6)用Debug的E命令改写内存中的内容
可以使用E命令来改写内存中的内容,比如,要将内存1000:
0~1000:
9单元中的内容分别写为0、1、2、3、4、5、6、7、8、9,可以用“e起始地址数据数据数据……”的格式来进行,如图2-13所示。
图2-13用E命令修改从1000:
0开始的10个单元的内容
图2-13中,先用D命令查看1000:
0~1000:
f单元的内容,再用E命令修改从1000:
0开始的10个单元的内容,最后用D命令查看1000:
0~1000:
f中内容的变化。
也可以采用提问的方式来一个一个地改写内存中的内容,如图2-14所示。
图2-14用E命令修改从1000:
10开始的4个单元的内容
如图2-14中,可以用E命令以提问的方式来逐个地修改从某一地址开始的内存单元中的内容,以从1000:
10单元开始为例,步骤如下:
①输入e1000:
10,按Enter键。
②Debug显示起始地址1000:
0010,和第一单元(即1000:
0010单元)的原始内容:
6D,然后光标停在“.”的后面提示输入想要写入数据,此时可以有两个选择:
其一为输入数据(我们输入的是0),然后按空格键,即用输入的数据改写当前的内存单元;其二为不输入数据,直接按空格键,则不对当前内存单元进行改写。
③当前单元处理完成后(不论是改写或没有改写,只要按了空格键,就表示处理完成),Debug将接着显示下一个内存单元的原始内容,并提示读者进行修改,读者可以用同样的方法处理。
④所有希望改写的内存单元改写完毕后,按Enter键,E命令操作结束。
可以用E命令向内存中写入字符,比如:
用E命令从内存1000:
0开始写入:
数值1、字符“a”,数值2,字符“b”,数值3,字符“c”,可采用图2.42中所示的方法进行:
从图2-15中可以看出,Debug对E命令的执行结果是,向1000:
0、1000:
2、1000:
4单元中写入数值1、2、3,向1000:
1、1000:
3、1000:
5单元中写入字符“a”、“b”、“c”的ASCII码值:
61H、62H、63H。
也可以用e命令向内存中写入字符串,比如:
用E命令从内存1000:
0开始写入:
数值1、字符串“a+b”、数值2、字符串“c++”、字符3、字符串“IBM”。
如图2-16所示。
图2-15用E命令向内存中写入字符
图2-16用E命令向内存中写入字符串
(7)用E命令向内存中写入机器码,用U命令查看内存中机器码的含义,用T命令执行内存中的机器码。
如何向内存中写入机器码呢?
我们知道,机器码也是数据,当然可以用E命令将机器码写入内存。
比如要从内存1000:
0单元开始写入这样一段机器码:
机器码对应的汇编指令
b80100movax,0001
b90200movcx,0002
01c8addax,cx
可用如图2-17中所示的方法进行。
图2-17用E命令将机器码写入内存
如何查看我们写入的或内存中原有的机器码所对应的汇编指令呢?
可以用U命令进行。
比如可以用U命令将从1000:
0开始的内存单元中的内容翻译为汇编指令,并显示出来。
如图2-18所示。
图2-18中,首先用E命令向从1000:
0开始的内存单元中写入了8个字节的机器码;然后用D命令查看内存1000:
0~1000:
1f中的数据(从数据的角度看一下我们写入的内容);最后用U命令查看从1000:
0开始的内存单元中的机器指令和它们所对应的汇编指令。
U命令的显示输出分为3部分:
每一条机器指令的地址、机器指令、机器指令所对应的汇编指令。
我们可以看到:
1000:
0处存放的是我们写入的机器码b80100所组成的机器指令,对应的汇编指令是movax,1;
1000:
3处存放的是我们写入的机器码b80200所组成的机器指令;对应的汇编指令是movcx,2;
1000:
6处存放的是我们写入的机器码01c8所组成的机器指令;对应的汇编指令是addax,cx;
1000:
8处存放的是内存中的机器码034942所组成的机器指令;对应的汇编指令是addcx,[bx+di+42]。
图2-18用U命令将内存单元中的内容翻译为汇编指令显示
由此,我们可以再一次看到内存中的数据和代码没有任何区别,关键在于如何解释。
如何执行我们写入的机器指令呢?
使用Debug的T命令可以执行一条或多条指令,简单地使用T命令,可以执行CS:
IP指向的指令,如图2-19所示。
图2-19使用T命令执行CS:
IP指向的指令
图2-19中,首先用E命令向从1000:
0开始的内存单元中写入了8个字节的机器码;然后用R命令查看CPU中寄存器的状态,可以看到,CS=0b39H、IP=0100H,指向内存0b39:
0100;若要用T命令控制CPU执行我们写到1000:
0的指令,必须先让CS:
IP指向1000:
0;接着用R命令修改CS、IP中的内容,使CS:
IP指向1000:
0。
完成上面的步骤后,就可以使用T命令来执行我们写入的指令了(此时,CS:
IP指向我们的指令所在的内存单元)。
执行T命令后,CPU执行CS:
IP指向的指令,则1000:
0处的指令b80100(movax,0001)得到执行,指令执行后,Debug显示输出CPU中寄存器的状态。
注意,指令执行后,AX中的内容被改写为1,IP改变为IP+3(因为movax,0001的指令长度为3个字节),CS:
IP指向下一条指令。
接着图2-19,我们可以继续使用T命令执行下面的指令。
如图2-20所示。
图2-20用T命令继续执行
在图2-20中,用T命令继续执行后面的指令,注意每条指令执行后,CPU相关寄存器内容的变化。
(8)用Debug的A命令以汇编指令的形式在内存中写入机器指令。
前面我们使用E命令写入机器指令,这样做很不方便,最好能直接以汇编指令的形式写入指令。
为此,Debug提供了A命令。
A命令的使用方法如图2-21所示。
图2-21用A命令向从1000:
0开始的内存单元中写入指令
图2-21中,首先用A命令,以汇编语言向从1000:
0开始的内存单元中写入了几条指令,然后用D命令查看A命令的执行结果。
可以看到,在使用A命令写入指令时,我们输入的是汇编指令,Debug将这些汇编指令翻译为对应的机器指令,将它们的机器码写入内存。
使用A命令写入汇编指令时,在给出的起始地址后直接按Enter键表示操作结束。
如图2-22中,简单地用A命令,从一个预设的地址开始输入指令。
图2-22从一个预设的地址开始输入指令
四、实验内容与步骤
使用Debug,将下面的程序段写入内存,逐条执行,记录每条指令执行后,CPU中相关寄存器中内容的变化。
机器码汇编指令
b8204emovax,4E20H
051614addax,1416H
bb0020movbx,2000H
01d8addax,bx
89c3movbx,ax
01d8addax,bx
b81a00movax,001AH
bb2600movbx,0026H
00d8addal,bl
00dcaddah,bl
00c7addbh,al
b400movah,0
00d8addal,bl
049caddal,9CH
提示:
可用E命令和A命令以两种方式将指令写入内存。
注意用T命令执行时,CS:
IP的指向。
五、思考与练习
PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。