zoukankan      html  css  js  c++  java
  • 实验1 用机器指令和汇编指令编程

    一、实验目的
    1. 熟练掌握使用debug工具编写和调试x86汇编命令的方法

    2. 掌握8086CPU、寄存器、内存的基础知识

    3. 理解并掌握内存中多字节数据的存放:小端法

    4. 理解并掌握「栈」内存空间的特性和使用

    5. 掌握指令mov, add, sub, jmp, push, pop的基础用法

    二、实验准备
    1. 复习教材第1~2章内容,完成教材内相关检测点

    2. 复习教材第3章「栈」的知识:栈的特性、寄存器 SS 和 SP、指令 push 和 pop ,完成教材 3.6~3.9 节内的问题 3.6~3.12,检测点 3.1~3.2 3.

    结合教材实验1(P35)和课程QQ群文件中的文档,学习debug工具用法。

    三、实验内容

    1.  教材实验1(P35)

    练习教材P35-45「预备知识:Debug的使用」,学习debug启动、退出及常用指令用法; 在练习基础上,完成「2. 实验任务」

    2.  教材实验2(P71)

    练习「1.预备知识:Debug 的使用」在练习基础上,完成「2. 实验任务」

    为了便于验证实验结果,对「2. 实验任务」的(1)做如下两点调整:

    ① 在使用 a 命令输入指令调试之前,先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H

    ② 将 P74 实验任务(1)中第1行的 mov ax, ffff → 改为 mov ax, 0022

    实验前,请先从理论上分析指令执行后各个填空处的值,并记录下来。

    实验时,通过在debug中调试,观察实验结果与理论分析是否一致;如果存在不一致的情形,尝试 发现问题所在,并分析原因。

    四、实验结论

    实验一  P35~P46

    实验任务(1)

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

    因为机器码数据较多,所以只用前4行实验。

    机器码 汇编指令

    b8  20  4e

    mov ax,4E20H
    05  16  14 add ax,1416H
    bb  00  20 mov bx,2000H
    01  d8 add ax,bx

    对前两行,我使用了E命令写入(指定了CS为1000,IP为0)

    用R命令查看寄存器的内容

    并通过T命令逐步单步调试,得到结果如下:

    需要注意的是,T命令在没有参数的情况下会从当前的CS:IP开始调试,所以查看了当前CS和IP的值并修改为1000:0。

    同时也可以对T命令追加参数 : t=1000:0

    用R命令写入:

    并通过T命令逐步单步调试,得到结果如下:

    实验任务(2)

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

    用A命令写入:

     因为单步调试较多,所以只截调试开始和调试出正确结果的部分:

    通过多次加法,实现乘法的计算。

    实验任务(3)

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

    尝试修改,并没有成功:

    因为,ROM是只读的,无法用E命令修改。

    实验任务(4)

    修改了内存后出现的现象:

    改变其中的数据,图案发生变化:

    改变地址,图案位置变化:

    实验二  P71~P75

     为了便于分析结果,

    ① 在使用 a 命令输入指令调试之前,先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H

    ② 将 P74 实验任务(1)中第1行的 mov ax, ffff → 改为 mov ax, 0022

    实验任务(1)

    ① 使用 E命令修改内存单元0022:0~0022:f 中的数据分别为50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H,并通过D命令查看是否正确写入。

    用A命令输入指令:

    用t命令单步调试:

    与预估的结果相符:(这图片我也不知道怎么成这样了)

     

    实验任务(2)

    ① 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,
    及修改后查看的部分

    用R命令查看寄存器初始值:

    用T命令单步调试:

    ① 前3行汇编指令的功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别是?

    前三行指令是给栈顶的段地址ss和偏移地址sp赋初值,因为不能直接把常数直接赋值给段寄存器所以先输入通用寄存器,在复制如段寄存器。

    初始时,栈顶是2000:0010;栈底是2000:000E。

    ② 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。

    后8位存放了放入栈中的数据,

    而前8位临时存放了需要写入栈中的数据。

  • 相关阅读:
    网站优化记录
    在pc游览器端模拟移动端幻灯片
    jquery消息提示框
    开发jquery tab 插件
    js检测是否安装了flash插件
    javaweb项目下解决360兼容模式不能下载文件问题
    简单的excel上传解析和错误反馈信息下载
    sqlserver带游标存储过程及调用函数
    oracle带游标存储过程编写
    简单的spring+dubbo提供和消费方
  • 原文地址:https://www.cnblogs.com/wyf-blogs/p/13805813.html
Copyright © 2011-2022 走看看