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

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

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

四、实验结论

1. 教材实验1结论

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

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

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

  (1)使用e命令的方式将指令写入内存:

    

    

 

 

   (2)使用a命令的方式将指令写入内存:

    

    

  实验任务(2):将下面3条指令写入从2000:0开始的内存单元中,利用值3条指令计算2的8次方

  mov x,1
  add ax,ax
  jmp 2000:0003

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

    

 

 

    

    

  实验任务(3):查看内存中的内容。PC机主板上的ROM中写有以恶生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图修改他们

  附上在debug里实验的截图,并且基于实验结果,作必要的文字说明。

    

    

    在8086PC机中,地址C0000~FFFFF的内存单元是ROM地址空间,为只读存储单元,对这一部分的内存进行修改是无效的

  实验任务(4):向内存从B8100H开始的单元中填写数据,如

  -e B8100:0000 01 01 02 02 03 03 04 04

  附上在debug里实验的截图,并且基于实验结果,作必要的文字说明

    

    

    

    在8086PC机中,地址A0000~BFFFF的内存单元中写入数据,就是向显存中写入数据,这些数据会被显示卡输出到屏幕上面

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内容为A4A2
  push bx             ;sp=00FC; 修改的内存单元的地址是2200:00FC内容为ACAA
  pop ax               ;sp=00FE; ax=ACAA
  pop bx               ;sp=0100; ax=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意味着什么?初始时栈顶和栈底分别是?

    第一行指令将2000赋值到ax寄存器中

    第二行指令将ax中的内容交给ss栈段寄存器

    第三行指令将10赋值给sp偏移地址寄存器

    此时的栈底和栈顶为SS:SP 2000:0010

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

    观察发现当栈地址寄存器被修改了之后,2000:0~2000:F这段空间的内容就被修改了,因此猜测可能是为了还原或者等其它操作,栈中还存放了其它寄存器如ax和cs中的数据

posted @ 2020-10-11 15:44  Sunnynight  阅读(199)  评论(2)    收藏  举报