专栏首页我是业余自学C/C++的实验一 查看CPU和内存,用机器指令和汇编指令编程

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

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

FISTP WORD PTR [BX+DI+1689]

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

(5)使用debug中的D命令查看内存中的内容。 我们使用“D 段地址:偏移地址”的格式来查看某个内存中的内容。比如查看内存10000H中的内容,地址格式是1000:0,然后用"D 1000:0"列出1000:0处的内容:

使用“D 段地址+偏移地址”的格式,Debug将列出从指定内存单元开始的128个内存单元的内容。 比如,我们运行命令“D 0AE1:0100”,结果如图所示:

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

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

注意:

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

例子:

使用“D 1000:9”查看1000:9处的内容:

Debug从1000:9开始显示,一直到1000:88,一共是128个字节。第一行中的1000:0~1000:8的内容不显示。

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

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

例子

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

(6)用Debug的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“。结果如下:

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

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

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

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

例子

用U命令将从1000:0开始的内存单元中的内容翻译为汇编指令,并显示出来。U命令的显示输出分为3部分:每一条机器指令的地址、机器指令、机器指令所对应的汇编指令。

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

用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中寄存器的状态。

注意:

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

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 汇编语言-第二章 寄存器(CPU工作原理)之执行指令过程(一)

    青木
  • redis_3.0.7_sds.c_sdsempty_so_on

    青木
  • free()

    青木
  • 汇编语言-第二章 寄存器(CPU工作原理)之执行指令过程(一)

    青木
  • python计算机基础(一)

    py3study
  • C/C++内存管理-学习笔记

    内存在程序编译的时候就已经分配好了,在程序运行期间这块内存都存在,如全局变量,static变量等。

    黑光技术
  • 完了!CPU一味求快出事儿了!

    我叫阿Q,是CPU一号车间里的员工,我所在的这个CPU足足有8个核,就有8个车间,干起活来杠杠滴。

    轩辕之风
  • Java后端开发三年,你不得不了解的JVM

    JAVA程序员,三年是个坎,如果过了三年你还没有去研究JVM的话,那么你这个程序员只能是板砖的工具了。下面来个JVM的解析可好?

    慕容千语
  • Redis专题(十二) ——Redis特殊情况处理机制

    Redis专题(十二) ——Redis特殊情况处理机制 (原创内容,转载请注明来源,谢谢) 一、内存淘汰 当redis的内存不足时,需要采取内存淘汰的方法,...

    用户1327360
  • memcached和redis的比较

    1 网络IO模型   Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字 ...

    wangxl

扫码关注云+社区

领取腾讯云代金券