实验一 查看CPU和内存,用机器指令和汇编指令编程

注意观察图中,CS和IP的值:
CS:IP处的地址就是CPU当前要读取、执行的指令。
Debug还列出了CS:IP所指向的内存单元处所存放的机器码,并将它翻译成为汇编治指令。
图中,CS:IP所指向的内存单元为0AE1:0100,此处存放的机器码为 DF9989916,对应的汇编指令为:

FISTP WORD PTR [BX+DI+1689]

还可以用R命令来修改寄存器中的内容:

R命令修改寄存器内容.PNG (5)使用debug中的D命令查看内存中的内容。
我们使用“D 段地址:偏移地址”的格式来查看某个内存中的内容。比如查看内存10000H中的内容,地址格式是1000:0,然后用"D 1000:0"列出1000:0处的内容:
D命令查看内存中内容.PNG
使用“D 段地址+偏移地址”的格式,Debug将列出从指定内存单元开始的128个内存单元的内容。
比如,我们运行命令“D 0AE1:0100”,结果如图所示:

D命令运行结果.PNG

解析:

使用D命令,Debug将输出三部分的内容:

  • 左边是每行的起始地址。
  • 右边是每个内存单元中的数据对应可显示的ASCII码字符。
  • 中间部分是从指定地址开始的128个内存单元的内容,用16进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。
    注意每行的中间有一个“-”,将每行的输出分成两部分,这仅仅是为了便于查看。

注意:

我们看到的内存中的内容,在不同的计算机中是不一样的,也可能每次用Debug看到的内容都不相同。
因为我们用Debug看到的都是原来就在内存中的内容,这些内容受随时都有可能变化的系统环境的影响。

例子:

使用“D 1000:9”查看1000:9处的内容:
结果显示.PNG
Debug从1000:9开始显示,一直到1000:88,一共是128个字节。第一行中的1000:0~1000:8的内容不显示。

在使用“D 段地址:偏移地址”,之后,接着使用D命令,可列出后续的内容:

使用D列出后续内容.PNG

列出Debug预设的地址处的内容.PNG

也可以指定D命令的查看范围:
D 段地址:起始偏移地址 结尾偏移地址

例子

比如要看1000:0~1000:9中的内容:

查看1000:0~1000:9单元中的内容.PNG

(6)用Debug的E命令改写内存中的内容。

例子:

将内存1000:0~1000:9单元中的内分别写为0,1,2,3,4,5,6,7,8,9,可以用“E 起始地址 数据 数据 数据…………”的格式来进行;

用E命令修改10个单元的内容.PNG
用E命令向内存中写入字符,比如:用E命令从内存1000:0开始写入:1、“a” 、2、“b”、3、“c”。结果如下:

用E命令向内存中写入字符.PNG
用E命令向内存中写入字符串,比如,用E命令从内存1000:0开始写入:1、”a+b“、2、”c++“、3、”IBM“。结果如下:

用E命令向内存中写入字符串.PNG
(7)用E命令向内存中写入机器码,用U命令查看内存中机器码的含义,用T命令执行内存中的机器码。

从内存1000:0单元开始写入这样一段机器码:

mov ax,0001      //机器码:b80100
mov cx,0002      //  机器码:b90200
add ax,cx            //机器码:01c8

用E命令将机器码写入内存.PNG
**我们可以用U命令查看我们写入内存的或内存中原有的机器码所对应的机器指令

例子

用U命令将从1000:0开始的内存单元中的内容翻译为汇编指令,并显示出来。U命令的显示输出分为3部分:每一条机器指令的地址、机器指令、机器指令所对应的汇编指令。
用U命令将内存单元中的内容翻译为汇编指令显示.PNG
我们可以看到,内存中的数据和代码没有任何区别。关键在于如何解释。

用debug的T命令可以执行一条或多条指令,简单地使用T命令,可以执行CS:IP指向的指令。要使用T命令执行写到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命令执行CSIP指向的指令.PNG

注意:

指令执行后,AX中的内容被改写为1,IP变为IP+3(因为mov ax,ooo1的指令长度为3个字节),CS:IP指向下一条指令。
我们可以继续用T命令向下执行指令:

用T命令继续执行.PNG

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

用A命令向从1000:0开始的内存单元中写入指令.PNG

A命令执行完毕后的结果查看.PNG

可以看到,在使用A命令写入指令时,我们输入的是汇编指令,Debug将这些汇编指令翻译为对应的机器指令,将它们的机器码写入内存。

本次实验中需要用到的命令

  • 查看、修改CPU中寄存器的内容:R命令
  • 查看内存中的内容:D命令
  • 修改内存中的内容:E命令(可以写入数据、指令,在内存中,它们实际上没有区别)
  • 将内存中的内容解释为机器指令和对应的汇编指令:U命令
  • 执行CS:IP指向的内存单元处的指令:T命令
  • 以汇编指令的形式向内存中写入指令:A命令

猜你喜欢

转载自my.oschina.net/u/1771419/blog/1620515