• [汇编语言实验]查看CPU和内存,用机器指令和汇编指令编程



    一、Debug的使用

    1.1 什么是Debug

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

    1.2 Debug功能

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

    1.3 进入Debug

    Debug是在DOS方式下使用的程序。我们在进入Debug之前,先进入到DOS方式,用以下方式可以进入DOS。

    1. 重启计算机,进入DOS,此时是实模式的DOS
    2. 在Windows中进入DOS方式,进入的是虚拟8086模式的DOS

    在Windows下进入Debug的方法:

    (a) 打开cmd

    在这里插入图片描述
    (b) 由于64位机没有debug,为了使用debug,先输入mount c F:\DOSBox\Masm
    之后输入c: 跳转至C盘
    后输入debug,即可进入debug

    在这里插入图片描述

    1.4 使用R命令查看、改变CPU寄存器中的内容

    在这里插入图片描述
    在这里我们可以查看到CS:IP = 07EF:0100 也就是说CPU当前要读取、执行的指令,机器码是00 00,对应的汇编指令为ADD [BX + SI],AL

    其他信息之后在进行讲解

    还可以使用R命令来改变寄存器中的内容
    在这里插入图片描述
    输入r ax即可修改AX中的内容,想查看修改后的结果可以再用R命令查看

    1.5 用Debug的D命令查看内存中的内容

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

    在这里插入图片描述
    使用 d 段地址:偏移地址 的格式,Debug将列出从指定内存单元开始的128个内存单元中的内容

    D命令会输出3部分内容:

    1. 中间部分的内容
      中间是从指定地址开始128个内存单元中的内容,用16进制的格式进行输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容,从图中,我们可以知道内存073F:0单元中的内容是CDH,内存073F:1的内容是20

    每行中间有一个“-”,他将每行输出分为两个部分,便于查看,比如要在途中找出1000:6B的内容,可以从1000:60找到行,“-”前面是1000:60 ~ 1000:67的8个单元,后面是1000:68 ~ 1000:6F的8个单元,这样我们就可以从1000:68单元向后数3个单元,找到1000:6B单元。

    1. 左边是每行的起始地址

    2. 右边是每个内存单元中的数据对应的可显示的ASCII码字符。073F:0、073F:1、073F:2中存放的数据是CD、20、3E,他们对应的ASCII字符分别是. >,没有对应的ASCII字符,在Debug中就用“.”去代替

    我们在Debug中看到的是原来就在内存中的内容,这些内容都可能会随时改变,当然我们也可以去改变内存、寄存器中的内容。

    使用d 1000:9查看1000:9处的内容
    在这里插入图片描述
    Debug从1000:9开始显示,一直到1000:88,一共是128个字节,第一行中的1000:0~1000:8单元中的内容不显示。

    在已进入Debug之后,用D命令直接查看,将列出Debug预设地址处的内容,如图
    在这里插入图片描述
    使用d 段地址:偏移地址之后,可以接着使用D命令列出后续内容
    在这里插入图片描述
    也可以去指定D命令的查看范围,采用d 段地址:偏移地址 结尾偏移地址 的格式,比如要查看1000:0 ~ 1000:9中的内容,可以用d 1000:0 9来实现
    在这里插入图片描述
    如果我们就想查看内存单元10000H中的内容,可以使用如下几种方法:
    在这里插入图片描述

    1.6 用Debug的E命令改写内存中的内容

    可以使用E命令来改写内存中的内容,比如将内存1000:0 ~ 1000:9单元中的内容分别改写为0、1、2、3、4、5、6、7、8、9,可以用e 起始地址 数据 数据 ...的格式来进行
    在这里插入图片描述
    也可以一个一个修改
    在这里插入图片描述
    如上图,我们可以用输入地址后,按Enter键,一个一个输入想修改的内容,按空格进行间隔

    也可以用E命令向内存单元中写入字符

    在这里插入图片描述
    也可以使用E命令向内存中写入字符串,比如:
    在这里插入图片描述

    那么我们如何向内存中写入机器码呢?机器码也是数据,所以也可以用E命令将机器码写入内存。比如我们要从内存1000:0单元开始写入这样一段机器码:

    机器码对应汇编指令
    b80100mov ax, 0001
    b90200mov cx, 0002
    01c8add ax, cx

    在这里插入图片描述
    但是如何查看写入或是内存中原有的机器码所对应的汇编指令呢?——U命令

    比如可以用U命令将从1000:0开始的内存单元中的内容翻译为汇编指令,并显示出来,如图
    在这里插入图片描述
    那么如何去执行我们写入的机器指令呢?用debug的T命令可以执行一条或是多条指令,简单使用T命令,即可执行CS:IP指向的指令

    在这里插入图片描述
    上图所示,我们看到CS:IP指向的地方不是我们想要的地方,所以用r命令修改了CS和IP中的内容,使其指向1000:0
    完成上述步骤后,我们就可以去执行T命令了

    在这里插入图片描述
    可以看到执行指令后,AX中的值发生了变化

    1.7 用Debug中的A命令以汇编指令的形式在内存中写入机器指令

    前面我们使用E命令写入机器指令,这样子做是很不方便的,最好能直接以汇编指令的形式写入指令,因此Debug提供了A命令,A命令使用方法如下图:

    在这里插入图片描述
    在光标闪烁处即可写入指令(按Enter键即可停止输入)
    在这里插入图片描述
    在使用A命令写入指令的时候,我们写入的是汇编指令,Debug将这些汇编指令翻译为对应的机器指令,然后将他们的机器码写入内存


    二、使用Debug,将下面程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中的内容变化

    在这里插入图片描述

    解答过程:
    在这里插入图片描述
    在这里插入图片描述


    三、将下面三条指令写入从2000:0开始的内存单元中,利用这三条指令计算2的8次方

    mov ax, 1
    add ax, ax
    jmp 2000:0003
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    在这里插入图片描述


    四、查看内存中的内容

    PC机主板上的ROM中写有一个生产日期,在内存FFF00H ~ FFFFFH的某几个单元中,请找到这个生产日期并试图改变它

    在这里插入图片描述
    在这里插入图片描述
    这里会发现修改不了ROM日期,ROM是只读存储器,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失。

  • 相关阅读:
    百人研发团队百亿销售规模的技术架构实践分享
    【人工智能】本地运行开源项目MMSegmentation引发的问题
    【Servlet】6:一篇文章搞懂Servlet对象的相互调用、数据共享
    [Android][JAVA][kotlin] 获取各种语言的星期,月份,长月份,缩写月份
    Java项目:SSM二手汽车交易商城网站管理系统
    2、搭建MyBatis
    c++-程序基本框架
    MySQL | 查询接口性能调优、编码方式不一致导致索引失效
    【书城项目】第三、四阶段--页面 jsp动态化、代码优化、EL修改表单
    mybatis项目启动报错:reader entry: ���� = v
  • 原文地址:https://blog.csdn.net/weixin_51304981/article/details/126522544