实验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

  1. 结合教材实验1(P35)和课程QQ群文件中的文档,学习debug工具用法。在课程QQ群文件->工具软件及相关文档说明文件夹,有如下文档:

关于汇编实验软件的简要说明.pdf

debug工具简介及用法.pdf

 

三、实验内容

1.  教材实验1(P35)

实验任务(1):可参照教材P41-43(7) E命令和U命令完成;

由于在该实验中机器码行数较多,且用到的知识点大致相同,因此只针对前四行机器码进行实验;

 实验任务(2):与教材P20的检测点(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

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

    

四、实验结论

1.  教材实验1结论

实验任务(1)

机器码数据较多,只用前4行实验即可。

用e命令和a命令两种方式,写入内存。用t命令单步调试。附上实验截图。

  • 使用a命令

 

 

 

  •  使用e命令

 

 

 

 

实验任务(2)

附上a命令写入和t命令单步调试实验截图。对于单步调试较多的部分,只截调试开始,和调试出正确结果的部分即可。

 

 

 

 

 

 

实验任务(3)

根据右侧的的可见字符推断生产日期为1992/01/01

 

 

使用e命令对FFF00H~FFFFFH部分的数据进行修改,数据没有改变,由于该部分地址为ROM区,只能读,无法更改只读存储器中的内容;

实验任务(4)

 

 

 

 

 

 可以发现在命令行窗口上出现了对应输入字节内容的图案,由于改写数据部分为显存数据空间,因此对其中数据进行修改,就会影响窗口图像输出;

2.  教材实验2结论

实验任务(1)

① 截图记录:使用 e 命令修改 内存单元0022:0~0022:f 中的数据,及修改后查看是否正确写入的操作

 

 

② 截图记录:使用 a 命令输入的 p74 指令

 

 

③ 截图记录:每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)

 

 

 

 

 

 

 

 

④ P74 中指令执行后各个寄存器填空结果,以在文档中手工标注或手机拍照截图方式复制在文档中。    对于③单步调试的观察,与理论上分析的结果进行比较,检验是否一致。如不一致,分析原因。

mov ax,0022

    mov ds,ax

 

    mov ax,2200

    mov ss,ax

 

    mov sp,0100

 

    mov ax, [0]        ;ax=5150

    add ax, [2]        ;ax=A4A2

    mov bx, [4]        ;bx=5554

    add bx, [6]        ;bx=ACAA

 

    push ax    ;sp=00FE;修改的内存单元的地址是:2200:00FE~FF 内容为:A4A2

    push bx    ;sp=00FC;修改的内存单元的地址是:2200:00FC~FD 内容为:ACAA

    pop ax     ;sp=00FE;    ax=ACAA

    pop bx     ;sp=0100;    bx=A4A2

 

    push [4]   ;sp=00FE;修改的内存单元的地址是:2200:00FE~FF 内容为:5554

    push [6]   ;sp=00FC;修改的内存单元的地址是:2200:00FC~FD 内容为:5756

 

经检验,理论分析与实验结果一致。

 

实验任务(2)

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

 

 

 

② 单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看

2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元值的变化,并思考原因。

 

 

 

 

 

 

 查阅相关资料后,得出结论:

  1. mov ss,ax后一条指令跳过的原因:

    每条指令执行完毕时检查标志寄存器的TF位的值,如果TF=1(即代表为单步执行),则程序会停下。
    但是有种特殊情况就是,当改变ss的值的时候,操作系统会禁用单步执行,这样做是为什么呢?通常情况下,改写了ss的值后,随后也会改变sp的值,这两步通常是一个整体,要么同时执行,要么同时不执行,所以也就有了当改变ss的值后不响应TF=1。

  2. 在2000:0~2000:f存储空间值在执行命令后出现变化原因:
    在上一个原因的基础上加以阐述,在mov ss,ax 命令后,会出现中断情况,而中断情况下一定是要保存住CS和IP寄存器内容的,不然中断恢复后代码不就不知道从哪里开始运行了,其余的寄存器也是同理,因此在对在对段寄存器进行值修改时,这些寄存器的值就按一定顺序暂存在了这段未使用的栈空间内。

 

以文字方式陈述:

① 前3行汇编指令的功能,特别是,mov sp, 10意味着什么?

第一行指令:为ax赋值2000H
第二行指令:为段寄存器ss赋值2000H
第三行指令:设置偏移地址sp为10;

初始化栈顶的实际物理地址为:20010 H
初始化栈底的实际物理地址为:2000E H

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

当执行完 mov ss,ax后,定义的未使用的栈空间中的值发生变化;
猜测原因:栈空间被使用成为了CS,IP,SS,SP,DS的数据暂存,应该执行中断操作下的保护措施。

 

 

 

 

posted @ 2020-10-18 22:13  热心市民朱同学  阅读(143)  评论(2编辑  收藏  举报