实验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
  3. 结合教材实验1(P35)和课程QQ群文件中的文档,学习debug工具用法。在课程QQ群文件->工具软件及相关文档说明文件夹,有如下文档: 关于汇编实验软件的简要说明.pdfdebug工具简介及用法.pdf

三、实验内容

1. 教材实验1(P35)

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

2. 教材实验2(P71)

  • 练习「1.预备知识:Debug 的使用」
  • 在练习基础上,完成「2. 实验任务」
  为了便于验证实验结果,对「2. 实验任务」的(1)做如下两点调整:
1 在使用 a 命令输入指令调试之前,先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H            2 将 P74 实验任务(1)中第1行的 mov ax, ffff → 改为 mov ax, 0022
  实验前,请先从理论上分析指令执行后各个填空处的值,并记录下来。
  实验时,通过在debug中调试,观察实验结果与理论分析是否一致;如果存在不一致的情形,尝试 发现问题所在,并分析原因。

四、实验结论 

1. 教材实验1结论

此部分书写内容:
教材实验1中「2. 实验任务」(P45)

  • 实验任务(1)

 使用debug工具将程序段写入内存并且逐条执行

  • 使用e命令以十六进制格式将程序输入内存,或者使用a命令以汇编指令格式将程序输入内存

      

  • 修改cs和ip寄存器,使得基址加上偏移量指向目标指令内存地址

  

  • 使用t命令逐条执行内存中的指令

  

  • 实验任务(2)

  利用mov,add和jmp三条指令计算2的八次方

  • 将课本中三条指令写入内存

  

  • 反复执行直到寄存器ax中得出2的八次方

  

  

  • 实验任务(3)   

   修改ROM中的生产日期

  • 修改前的结果使用d指令查看相应内存

    

  • 使用e指令对内存中内容修改后显示内容不变

  由于目标地址的内存单元属于只读存储器,对其进行修改操作结果不发生改变。

 

  • 实验任务(4) 

  向目标内存单元中写入数据观察结果

  

  在8086构架中,显存地址空间和所有其他存储器地址并列组成逻辑存储器,可以通过访问逻辑存储器相应的地址访问显存空间,对显存单元数据进行写入即可在屏幕上显示相应内容。

2. 教材实验2结论

  • 实验任务(1)

  1 截图记录:使用 e 命令修改 内存单元0022:0~0022:f 中的数据,及修改后查看是否正确写入的操作
  
  2 截图记录:使用 a 命令输入的 p74 指令
  
  我这里栈顶寄存器(ss<-ax<-2200)赋值误写为2000了,在课本答案填写时进行了纠正。
  
  3 截图记录:每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)4 P74 中指令执行后各个寄存器填空结果,以在文档中手工标注或手机拍照截图方式复制在 文档中。 对于3单步调试的观察,与理论上分析的结果进行比较,检验是否一致。如不一 致,分析原因。
  通过ds和[address]访问
  
  
  
  
  
  对栈操作
  
  
  
  
  将ds加[address]读出的数据存压入栈中
  
  
  课本习题结果
  
  • 实验任务(2)

  1 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,及修改后查看的部分
  输入7行指令
  
  修改2000:0000-2000:000F
  
  2 单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看 2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元 值的变化,并思考原因。以文字方式陈述:
  第一步执行
  
  第二步执行
  
  
  第三步执行
  
  第四步执行
  
  第五步执行
  
  第六步执行
  
  1 前3行汇编指令的功能,特别是,mov sp, 10意味着什么?

  将偏移量10存放入寄存器sp中

  初始时栈顶和栈底分别是?

  栈顶2000:0010

  栈低由bp寄存器指向

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

  在第一次将ax寄存器中数据push入栈时,地址为2000:000E和2000:0004的双字节内存空间中均出现了ax

  在第二次将ax寄存器中数据push入栈时,地址为2000:000C和2000:0002的双字节内存空间中均出现了ax,而先前的2000:0004中数据变为了00 00

  我不会解释XD

五、实验总结

  1. -a命令用汇编语言向内存中输入内容,-e命令则以十六进制形式改变内存中的内容,输入空格可以看到先前一个字节中存放的内容。
  2. 在内存指定区域输入指令后,用-r指令改变cs和ip寄存器中的数据,使其指向程序段开始地址,用-t指令可以住行顺序执行先前输入的指令。
  3. ss:sp指向栈顶,在栈空时指向存放第一个栈元素的后面一个字节。占据多个字节的数据在栈中存放遵循小端法,即低位数据放在地址低位,高位数据放在地址高位,且用低位地址作为数据的地址。
  4. -r指令加上寄存器名可以直接对寄存器值进行修改。
  5. ds,ss寄存器不能直接赋值,需要使用通用寄存器进行过渡。

 

posted @ 2020-10-09 21:24  RW_NEO  阅读(281)  评论(2)    收藏  举报