实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程

一、预备知识:Debug的使用

1.1 什么是Debug?

Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。

1.2 将用到的Debug功能

Debug的命令比较多,共有20多个,下面六个是比较常用的:

  • 用R命令查看、改变CPU寄存器的内容
  • 用D命令查看内存中的内容
  • 用E命令改写内存中内容
  • 用U命令将内存中的机器指令翻译成汇编指令
  • 用T命令执行一条机器指令
  • 用A命令以汇编指令的格式在内存中写入一条机器指令

1.3 Debug的安装启动

利用Vmware安装DOS,同时注意配套的masm的安装,网上有很多的教程。

启动后如下图所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》

二、用R命令查看、改变CPU寄存器的内容

我们可以使用r命令查看CPU中各寄存器的内容:

《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
注意CS和IP的值,CS=1CA7,IP=0100,也就是说,内存1CA7:0100处的指令为CPU当前要读取、执行的指令。在所有寄存器值的下方,Debug列出了1CA7:0100,同时列出了这个内存单元所存放的机器码并翻译成了汇编指令。其中,机器码为0000,对应的汇编指令为ADD [BX+SI],AL

debug输出的右下角还有一个信息,DS:0000=CD,这点暂时可以不用理会。

我们还可以用R命令来改变寄存器中的内容,如下图所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
如果我们要修改一个寄存器中的值,比如AX中的值,可用R命令后加寄存器名来进行,输入r ax后按Enter键,将出现:做为输出提示,在:后面输入要写入的数据后按Enter键,即完成了对AX中内容的修改。

我们也可以利用R命令修改CS和IP中的内容:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
如果我们要查看修改后的值,再次调用r指令即可。

三、用D命令查看内存中的内容

如果我们想知道内存10000H处的内容,可以用d 段地址:偏移地址的格式来查看,如图所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
使用d 段地址:偏移地址的格式,Debug将列出从指定内存单元开始的128个内存单元的内容。上图中,Debug列出了1000:0~1000:7F中的内容。上面的内容分为三部分:

  1. 中间是从指定地址开始的128个内存单元(内存单元按照字节寻址)的内容,用十六进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。从上图中,我们可以知道,内存1000:0单元中的内容是00H,内存1000:1单元中的内容是50H,内存1000:0~1000:F中的内容都在第一行。注意在每行的中间有一个”-“,它将每行的输出分成两部分,这样便于查看。
  2. 左边是每行的起始地址
  3. 右边是每个内存单元中的数据对应的可显示的ASCⅡ码字符。当没有对应可显示的ASCⅡ字符,Debug就用”.”来代替。

当我们使用d 1000:9查看1000:9处的内容,Debug将怎么样输出呢?如下图所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
可以看到Debug从1000:9开始显示,一直到1000:88,一共是128个字节。第一行中的1000:0~1000:8单元中的内容不显示。

在使用d 段地址:偏移地址之后,接着使用D命令,可列出后续的内容,如下图所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
我们也可以指定D命令的查看范围,此时采用d 段地址:起始偏移地址 结尾偏移地址的格式。比如要看1000:0~1000:9中的内容,可以用”d 1000:0 9″实现,如下图所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》

四、用E命令改写内存中的内容

可以使用E命令来改写内存中的内容,比如,要将内存1000:0~1000:9单元中的内容分别写为0、1、2、3、4、5、6、7、8、9,可以用”e 起始地址 数据 数据 数据 …”的格式来进行,如下图所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
也可以采用提问的方式来一个个地改写内存中的内容,如下图所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
步骤如下:

  1. 输入e 1000:10,按Enter键
  2. Debug显示起始地址1000:0010,和第一单元(即 1000:10单元的原始内容:FA,然后光标停在”.”的后面提示输入想要写入的数据,此时可以有两个选择:其一为输入数据(我们输入的是0),然后按空格键,即用输入的数据改写当前的内存单元;其二为不输入数据,直接按空格键,则不对当前内存单元进行改写。
  3. 当前单元处理完成后(不论是改写还是没有改写,只要按了空格键,就表示处理完成),Debug将接着显示下一个内存单元的原始内容,并提示进行修改,我们可以用同样的方法处理
  4. 所有希望改写的内存单元改写完毕后,按Enter键,E命令操作结束

我们也可用E命令向内存中写入字符串,如下图所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》

五、用E命令写入机器码,用U命令查看机器码的含义,用T命令执行机器码

我们知道,机器码也是数据,所以可以用E命令将机器码写入内存。比如我们要从内存1000:0单元开始写入这样一段机器码:

机器码			对应的汇编指令
b80100			mov ax,0001
b90200			mov cx,0002
01c8			add ax,cx

就可以用下图第二行所示的方式使用E命令写入机器码。
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
在上图中,首先用E命令向从1000:0开始的内存单元中写入了8个字节的机器码;然后用D命令查看内存1000:0~1000:1f中的数据(从数据的角度看一下写入的内容);最后用U命令查看从1000:0开始的内存单元中的机器指令和它们所对应的汇编指令。

U指令的显示输出分为3部分:每一条机器指令的地址、机器指令、机器指令所对应的汇编指令,我们可以看到:

  • 1000:0处存放的是写入的机器码b8 01 00所组成的机器指令,对应的汇编指令是mov ax,1
  • 1000:3处存放的是写入的机器码b9 02 00所组成的机器指令,对应的汇编指令是mov cx,2
  • 1000:6处存放的是写入的机器码01 c8所组成的机器指令,对应的汇编指令是 add ax,cx
  • 1000:8处存放的是内存中的机器码0e(不是后写入的),对应的汇编指令是push cs

从上面,我们可以再一次看到内存中的数据和代码没有任何区别,关键在于如何解释。

完成了上面的步骤后,我们就可以使用Debug的T命令来执行我们写入的指令了,在执行指令前,我们需要将CS:IP指向我们所需要的指令:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
完成上面的步骤后,我们就可以使用T命令来执行我们写入的指令了(此时,CS:IP指向我们的指令所在的内存单元)。执行T命令后,CPU执行CS:IP指向的指令,则1000:0处的指令b8 01 00(mov ax,0001)得到执行,指令执行后,Debug显示输出CPU中寄存器的状态。
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
可以看到,指令执行后,AX中的内容被改写为1,IP改变为IP+3,CS:IP指向下一条指令。

我们可以继续执行下面的指令,一个完整的流程如下所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》

六、用Debug的A命令以汇编指令的形式在内存中写入机器指令

前面我们使用E命令写入机器指令,这样做很不方便。Debug提供了A命令,可以以汇编指令的形式写入指令。A命令的使用方法如下所示:
《实验1-利用Debug查看CPU寄存器和内存+利用机器指令和汇编指令编程》
在上图中,首先用A命令,以汇编语言向从1000:0开始的内存单元中写入了几条指令,然后用D命令查看A命令的执行结果。可以看到,在使用A命令写入指令时,我们输入的是汇编指令,Debug将这些汇编指令翻译为对应的机器指令,将它们的机器码写入内存。

使用A命令写入汇编指令时,在给出的起始地址后直接按Enter键表示操作结束。

    原文作者:你回到了你的家
    原文地址: https://blog.csdn.net/kking_edc/article/details/110518648
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞