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

2018-02-11 14:04:20来源:oschina作者:Frost729人点击

分享

注意观察图中,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命令

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台