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

一、实验目的

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工具用法。

三、实验内容

1. 教材实验1结论
此部分书写内容:
教材实验1中「2. 实验任务」(P45)
实验任务(1)
机器码数据较多,只用前4行实验即可。
用t命令和a命令两种方式,写入内存。用t命令单步调试。
实验截图:

 

 

实验任务(2)
附上a命令写入和t命令单步调试实验截图:

 

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

通过d命令,找到了本机的出厂日期,在FFF0:00F0位置,日期为:1992.01.01;接着用e命令对该出厂日期进行修改,发现无法修改成功。原因为:日期信息位于ROM区,不能对其进行修改。

实验任务(4)
附上在debug里实验的截图:
 

 

 原因分析:A0000~BFFFF为显存地址空间,改写其中的数据会显示不同的图案

2. 教材实验2结论
此部分书写内容:
教材实验2中「2. 实验任务」(P74)实验任务(1)
① 截图记录:使用 e 命令修改 内存单元0022:0~0022:f 中的数据,及修改后查看是否正确
写入的操作
② 截图记录:使用 a 命令输入的 p74 指令
③ 截图记录:每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)

 

 

 

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

 

 观察以上调试的结果发现,与理论分析的结果是一致的。

实验任务(2)
① 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,
及修改后查看的部分
② 单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看
2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元
值的变化,并思考原因。

 

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

意味着将2000:0010起的这段内存空间作为栈段使用,这里同样出现了修改SS的值和修改SP的值同步出现的情况。这也是因为CPU的中断机制(OS抢占性的资源调度方式,根据程序的优先级来决定哪项程序优先执行)初始栈顶的地址为2000:0010,初始栈底地址为2000:000E.

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

这是因为在8086CPU 自定义的内存空间作为栈时,CPU会为了保证栈的完整性这时候将与栈相关的环境变量一起存储到该内存空间内,比如这里记录了操作的CSIP地址,还有压入栈的内容,由最后一张图可以看见将数据3366H3132H压入了该栈段内.

posted @ 2020-10-15 18:49  xiqingyu  阅读(87)  评论(2)    收藏  举报