使用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 命令

浙公网安备 33010602011771号