一、实验目的


 

  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工具用法。
  在课程QQ群文件->工具软件及相关文档说明文件夹,有如下文档:
  关于汇编实验软件的简要说明.pdf
  debug工具简介及用法.pdf

 


三、实验内容


教材实验1

  实验任务一、

    用E命令和A命令以两种方式将P45书本指令写入内存。

    (注:这里只写入书本前4行指令-->b8 20 4e 05 16 14 bb 00 20 01 d8)

    (1)E命令

    1、用e命令将指令写入内存1000:0,这里输入后可以使用u命令显示1000:0地址后的每一条指令的地址、机器指令、机器指令所对应的汇编指令。

    

    2、使用r cs与r ip指令将CS:IP的值修改到10000H的位置并使用t命令单步运行查看结果:

    

     3、这里在使用t命令时也可以t后加上数字(16进制数),表示一次执行多条指令:

    

     (3)A命令

    1、使用a命令向2000:0内存中写入汇编指令并使用d命令查看2000:0内存中的内容:

    

    2、使用t命令从2000:0地址单元开始执行指令,需要使用-t =2000:0让cs:ip指向2000:0

     (当然这里也可以先用rcs和rip指令设置指向2000:0):

    

  实验任务二、

    将mov ax,1;add ax,ax;jmp 2000:0003;

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

    1、这里t命令要执行10(16进制数)次。

    

  实验任务三、

     查看FFF00H~FFFFFH的某几个单元中的ROM中写有的一个生产日期

    1、使用d命令查看FFF0:0000后的内存单元:

    

     2、根据图片可以看出生产日期应该是在内存单元FFF0:00F5~FFF0:00FC中,使用e命令修改此处的机器码:

    

    3、结果说明:从图片中可以看出e命令修改此处机器码失败,地址C0000~FFFFF的内存单元中写入数据的操作是无效的,因为这等于改写只读存储器中的内容。

  实验任务四、

     向内存从B8100H开始的单元中填写数据,观察结果,后改变填写的地址,观察结果。

    1、使用e命令从B8100H开始的单元中填写数据如:-e B810:0000 01 01 02 02 03 03 04 04:

      

     2、改变填写的地址,再来观察结果的变化:

     

     3、结果说明:A0000~BFFFF为显存地址空间,向此单元写数据,就是向显存中写入数据,这些数据会被显卡输出到显示器特定区域。


教材实验2

  实验任务一、

    1、使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H,及修改后查看是否正确写入的操作:

    

       2、使用 a 命令输入的 p74 指令,如下图所示:

    

    3、每一行指令的单步调试结果:

    

     

    

     

    书本内容填空:

    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=0010;  bx=A4A2

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

    检验得结果一致。

   实验任务二、  

    ① 截图记录图 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:把ax寄存器中的值存入堆栈段寄存器ss中。

      mov sp,10:把10H存入堆栈指针寄存器sp中,表示当前堆栈栈顶的偏移地址。

      初始时栈顶为2000:0010,栈底为2000:000e,此时为空栈

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

     分析发现,2000:0000~2000:000f这段地址空间是存放的是栈的数据,其中包括栈的此时栈顶的数据,cs:ip以及栈此时的数据内容。

 

 posted on 2020-10-15 21:40  路远曦  阅读(190)  评论(3)    收藏  举报