实验1 用机器指令和汇编指令编程

  一、实验目的

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

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

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

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

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

  二、实验内容

1. 教材实验1P35

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

2. 教材实验2P71

练习「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中调试,观察实验结果与理论分析是否一致;如果存在不一致的情形,尝试  发现问题所在,并分析原因。

  四、实验结论

     1. 教材实验1结论

实验任务(1)

将下面程序段写入内

机器码    汇编指令

b8 20 4e   mov ax,4E20H

05 16 14   add ax,1416H

bb 00 20      mov bx,2000H

01 d8      add ax,bx     

      •   用e命令将程序写入内存,写完之后可以使用u命令查看汇编指令是否正确

       d命令查看内存

      

 

      •  用a命令将程序写入内存,可以直接以汇编语言的形式写入内存,可操作性强

       

        用t命令进行单步调试,此时需要时CS:IP指向存储程序的内存起始地址

       

         

       实验任务(2)

用a命令写入,并修改CS:IP指向2000:0

       

       

       成功计算出2^8=256(0100H),主要是通过jmp实现循环进行累加。

实验任务(3)

       生产日期为1992.01.01,接下来进行修改操作

       

       进行修改操作,但是并没有修改成功,因为C0000~FFFFF是只读存储器(ROM)的地址,所以对其进行写入数据的操作是无效的。 

实验任务(4)

向内存B8100H开始的单元中填写数据

       

       

 

 

       当修改数据的地址不变,里面的数据变化时,图案的形状和颜色会有变化,图案的位置不变,当只改变地址,不改变里面的数据时,

      图案的位置会发生辩护,形状和颜色不变。

      A0000~BFFFF为显存地址空间,向该部分中写入的数据,会被显示卡输出到显示器上。

2. 教材实验2结论

实验任务(1)

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

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

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

 

 

       

 

 

       

 

 

       

 

 

 

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

 

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,  内容为 A4A2

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

pop ax      sp=00FE;  ax=ACAA

pop bx      sp=0100;   bx=A4A2

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

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

 

经分析理论与实验结论一致

实验任务(2)

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

② 单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元值的变化,并思考原因。

 

       

 

       

以文字方式陈述:

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

mov ax,2000    将2000H传入ax寄存器

mov ss,ax      将2000H通过ax寄存器传入ss寄存器

mov sp,10     初试化栈顶,将栈顶偏移地址设置为0010H

初始时栈顶是 2000:0010H

   栈底是2000:000EH

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

Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。

       在2000:0开始的地址中,中间过程存储了cs,ip,ax的值。

 

版权声明:本文为yoyoLi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yoyoLi/p/13823468.html