zoukankan      html  css  js  c++  java
  • 实验一 查看CPU和内存,使用机器语言和汇编语言进行编程

    实验一  查看CPU和内存,使用机器语言和汇编语言进行编程

    .预备知识:Debug的使用

       DebugDOSWindows提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。是汇编程序设计中常用的调试工具。在Debug环境下,可以调试经汇编、连接后生成的可执行程序,编写简单的程序。

    32位操作系统下debug的启动与退出:

    启动:

     方法一:单击“开始”→“运行”(或使用快捷键Windows+R),输入cmd,确定,进入dos界面,输入debug,回车,进入debug调试环境,以短线“—”为命令提示符。

     方法二:单击“开始”→“运行”(或使用快捷键Windows+R),输入debug,确定,即进入debug调试环境,以短线“—”为命令提示符。

    退出:

    使用q命令,回车即可。

    Debug命令格式和参数:

    debug中的命令大小写等价;

          Debug中数字默认为十六进制表示,不需要加H

          debug中输入命令后,按下回车键执行;按下ctrl+c则终止命令的执行;

          debug中命令和参数之间可以没有分隔符(如空格)。

    64位操作系统下使用debug

        Debug不能在64位操作系统下运行,因此需要下载debug32DOS模拟器(在此使用DOSBOX)。

    DOSBOX下载:https://www.dosbox.com/download.php?main=1

    安装下载Debug.exe

    环境配置:找到DOSBox安装目录下的DOSBox 0.74 Options.bat文件,然后双击:

    进入文本,在末尾添加如图示:

    在此环境已配置好了。

    2. 常用debug功能

    l  r命令查看、改变CPU寄存器的内容:

    R<回车>

    显示所有寄存器的值

    R AX<回车>

    显示当前AX所谓值为0000,若要修改,则在冒号后输入要修改的值,如输入1234,回车再用—R AX查看,可见AX值已修改。如若不修改,则两次回车即可。

    l D命令查看内存中的内容:

    D<回车>

    D命令直接查看,列出预设地址处128位个字节内容

     

    D  地址

    D  1001

    显示从当前地址开始之后128个字节内容

     

    D 地址范围

    D 1001  1008

    两种方式显示指定范围内存储单元的内容,如上图

    l E命令改写内存中内容;

    E 地址  数据 数据·····(或字符)

    E  1001  0 1 2 3 4 5 6 7

    E命令修改从1001开始的8个单元的内容,用D查看内容变化

    也可以用提问方式逐个修改:

    a. 输入E 1001,按enter键;

    b. Debug显示起始地址,和起始单元内容,光标停在”.”后提示想要写入数据,输入数据按空格,用输入数据修改当前内存单元;或不输入数据直接按空格,即不对当前单元进行修改;

    c. 当前单元处理完成后,接着显示下一单元的内容,并提示净宗修改,同样方法进行处理;

    d. 当所有希望改写的内存单元改写完后,按enter键,E命令操作结束。

    也可用E命令向内存中写入字符串。

    U命令将内存中的机器指令翻译成汇编指令

    E命令向内存中写入机器码,D命令查看写入的机器码用U命令可以查看每一条机器指令的地址、机器指令,并将内存单元中的内容翻译为汇编指令并显示出来。

    T命令执行一条机器指令

    E命令向从10000开始的内存单元中写入8个字节的机器码;R命令查看CPU中寄存器的状态,CS=073FIP=0100,指向内存073F0100;用R命令修改CSIP中的内容,使CSIP指向10000。然后就可以用T命令来执行我们写入的指令,执行后,AX中的内容变为1,IP变为IP+3。

    A命令以汇编指令的格式在内存中写入一条机器指令

    A 起始地址,以汇编语言向从1000:0开始的内存单元中写入了几条指令,然后用D命令查看A命令的执行结果

    A 回车,从预设的地址开始输入,想要结束A命令,则不输入汇编指令,直接按enter键即结束A命令

    —?<回车>

    显示常用命令集,可帮助快速找到所需命令。

    2. 实验任务

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

    提示:用E命令和A命令以两种方式将指令写入内存,T命令执行时注意CS:IP的指向。

     E命令从10000处开始写入机器码,因为有长度限制,我只写到第八条bb 26 00这一条,输入R命令查看CPU内容,并修改CSIP使其指向10000。然后使用T命令逐条执行机器码如下:

    同样方法从10000012处开始写从bb 26 00以下的机器码,CSIP指向10000012

    A命令以汇编指令方式写入内存,打开DOSBOX,输入debug进入调试模式,使用R命令修改CSIP的内容使其指向10000,先用D命令查看从10000开始的单元内容,然后用A命令从10000处开始逐条写入汇编指令,再次用D命令查看汇编指令执行后单元里面的内容。

    (2)将下面三条指令写入从20000开始的单元中,利用这三条指令计算2的八次方。

    MOV AX,1

    ADD AX,AX

    JMP 2000:0003

    一直逐条执行T命令,直到AX=0100,因为debug程序中数字默认16进制,100H=256=2^8

    计算所需执行指令条数 (3+2*7=17=11H),也可直接输入: —T=0  11

     3)查看内存中的内容。PC机主板上的ROM中写有一个期,在内存FFF00H~FFFFFH的某几个单元,请找到并试图修改它。

    可以看见E命令并未修改成功。

    这是因为RomRead Only Memory)只读存储器,这种存储器(Memory)的内容任何情况下都不会改变,计算机与用户只能读取保存在这里的指令,和使用存储在ROM的数据,但不能变更或存入数据。

    (3)向从内存单元B8100H开始的单元中填写数据,如:

    E B8100000 01 01 02 02 03 03 04 04

    修改数据后:

    修改地址后:

    实验发现每两个字节表示一个字符,其中前一字节控制字符种类,后一字节控制颜色。偏移地址与字符在终端中显示的位置有关。

    实验总结:

    通过这次实验,我对汇编debug的常用功能有了基本了解,对汇编语言这门课程有了更深层次的认识。知道了debug的调试环境以及配置问题,了解了汇编程序的简单编写,知道了机器指令与汇编指令编程的方式。

  • 相关阅读:
    二叉树中序遍历
    前序遍历
    配置免秘钥登录
    pip安装
    zookeeper C client API 和zkpython 的安装
    安装 Java
    json递归查询
    php 编译安装
    docker 中 安装配置 mysqlcluster(arm)
    glibc编译安装
  • 原文地址:https://www.cnblogs.com/ljzww/p/9860873.html
Copyright © 2011-2022 走看看