使用Debug查看 CPU 和内存,用机器指令和汇编指令编程

1、预备知识:Debug 的使用

(1)、什么是Debug?

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

(2)、我们用到的 Debug 功能

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

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

 

  注意 CS 和 IP 的值,CS=0743,IP=0100,也就是说,内存 0743:0100 处的指令为 CPU 当前要读取、执行的指令。在所有寄存器的下方,Debug 还列出了 CS:IP 所指向的内存单元所存放的机器码,并将它翻译为汇编指令。可以看到,CS:IP 所指向的内存单元为 0743:0100,此处所存放的机器码为0000。

  我们可以用R命令来改变寄存器中的内容,如下所示

  若要修改一个寄存器的值,比如 AX 的值,可用 R 命令后加寄存器名来进行,输入“r ax”后按回车键,将出现“:”作为输入提示,在后面输入要写入的数据后按回车键,即完成了对 AX 中内容的修改。若想看一下修改的结果,可再用 R 命令查看。

  

  用  R 命令修改 CS 和 IP 中的内容。

 

 

(4)、用 Debug 的 D 命令查看内存中的内容。

  如果我们想知道内存 10000H 处的内容,可以用“d 段地址:偏移地址”的格式来查看,如下图所示:

 

  使用“d 段地址:偏移地址”的格式,Debug 将列出从指定内存单元开始的 128 个内存单元的内容。

a、中间是从指定地址开始的 128(16*8) 个内存单元的内容,用十六进制的格式输出,每行的输出从 16 的整数倍的地址开始,最多输出 16 个单元的内容。

b、左边是每行的起始地址。

c、右边是每个内存单元中的数据对应的可显示的、ASCII 码字符。

 

(5)、用 Debug 的 E 命令来改写内存中的内容。

  可以用 E 命令来改写内存中的内容,比如,要将内存 1000:0~1000:9 单元中的内容分别写为 0、1、2、3、4、5、6、7、8、9,可以用“e 起始地址 数据 数据 数据 ······”的格式来进行,如下所示:

 

  可以用 E 命令向内存中写入字符,比如,用 E 命令从内存 1000:0 开始写入数值 1、字符“a”、数值 2、字符“b”、数值 3、字符“c”,如下所示:

  也可以用 E 命令向内存中写入字符串,比如,用 E 命令从内存 1000:0 开始写入:数值 1、字符串“a+b”、数值 2、字符串“c++”、数值 3、字符串“IBM”,如下所示:

 

(6)用 E 命令向内存中写入机器码,用 U 命令查看内存中机器码的含义,用 T 命令执行内存中的机器码。

  比如我们要从内存 1000:0 单元开始写入这样一段机器码:

 

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

 

 可用如下方式进行:

  如何查看写入的或内存中原有的机器码对应的汇编指令呢?可以使用 U 命令。比如可以用 U 命令将从 1000:0 开始的内存单元中的内容翻译为汇编指令,并显示出来,如下所示:

 

  首先用 E 命令向从 1000:0 开始的内存单元中写入了 8 个字节的机器码;然后用 D 命令查看内存 1000:0~1000:1f 中的数据;最后用 U 命令查看从 1000:0 开始的内存单元中的机器指令和它们对应的汇编指令。

  U 命令的显示输出分为 3 部分,每一条机器指令的地址、机器指令、机器指令所对应的汇编指令。

  如何执行我们写入的机器指令呢?使用 Debug 的 T 命令可以执行一条或多条指令,简单地使用 T 命令,可以执行 CS:IP 指向的指令,

 

  上图中,我们执行了上面写入的几条汇编指令。我们使用 R 查看当前寄存器的内容,可以知道,当前 CS=FF00H、IP=0200H,指向内存FF00:0200 ;若要 T 命令控制 CPU 执行我们写到 1000:0 的指令,必须先让 CS:IP 指向 1000:0;接着使用 R 命令修改 CS、IP 中的内容,使 CS:IP 指向 1000:0。

  完成上面的步骤后,就可以使用 T 命令来执行我们写入的指令了(此时,CS:IP 指向我们的指令所在的内存单元)。执行 T 命令后,CPU 执行 CS:IP 所指向的指令,则 1000:0 处的指令b8 01 00(mov ax,0001)得到执行,指令执行后,Debug 显示输出 CPU 中寄存器的状态。

  接着,我们可以继续使用 T 命令执行下面的指令:

 

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

  前面我们使用 E 命令写入机器指令,这样做很不方面,最好能直接以汇编指令的形式写入指令。为此,Debug 提供了 A 指令。

   上图中,首先用 A 命令,以汇编语言向从 1000:0 开始的内存单元写入了几条指令,然后用 D 命令查看 A 命令的执行结果。可以看到,在使用 A 命令写入指令时,我们输入的是汇编指令,Debug 将这些汇编指令翻译为对应的机器指令,将它们的机器码写入内存。

  简单地使用 A 命令(不带参数),将会从一个预设的地址开始输入指令。

 

小结:

查看、修改 CPU 中寄存器的内容:R 命令

查看内存中的内容:D 命令

修改内存中的内容:E 命令(可以写入数据、指令,在内存中,它们实际上没有区别)

将内存中的内容解释为机器指令和对应的汇编指令:U 命令

执行 CS:IP 指向的内存单元处的指令:T 命令

以汇编指令的形式向内存中写入指令:A 命令

 

posted @ 2017-10-03 12:19  佚名000  阅读(1365)  评论(0)    收藏  举报