实验1 用机器指令和汇编指令编程
实验1 用机器指令和汇编指令编程
一、实验目的
1. 熟练掌握使用debug工具编写和调试x86汇编命令的方法 2. 掌握8086CPU、寄存器、内存的基础知识
3. 理解并掌握内存中多字节数据的存放:小端法
4. 理解并掌握「栈」内存空间的特性和使用
5. 掌握指令mov, add, sub, jmp, push, pop的基础用法
二、实验准备
- 复习教材第1~2章内容,完成教材内相关检测点
- 复习教材第3章「栈」的知识:栈的特性、寄存器 SS 和 SP、指令 push 和 pop ,完成教材3.6~3.9 节内的问题 3.6~3.12,检测点 3.1~3.2
- 结合教材实验1(P35)和课程QQ群文件中的文档,学习debug工具用法。在课程QQ群文件->工具软件及相关文档说明文件夹,有如下文档: 关于汇编实验软件的简要说明.pdfdebug工具简介及用法.pdf
三、实验内容
1. 教材实验1(P35)
- 练习教材P35-45「预备知识:Debug的使用」,学习debug启动、退出及常用指令用法;
- 在练习基础上,完成「2. 实验任务」
2. 教材实验2(P71)
- 练习「1.预备知识:Debug 的使用」
- 在练习基础上,完成「2. 实验任务」
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中调试,观察实验结果与理论分析是否一致;如果存在不一致的情形,尝试 发现问题所在,并分析原因。
2. 教材实验2结论
四、实验结论
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)

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

我这里栈顶寄存器(ss<-ax<-2200)赋值误写为2000了,在课本答案填写时进行了纠正。
3 截图记录:每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)4 P74 中指令执行后各个寄存器填空结果,以在文档中手工标注或手机拍照截图方式复制在 文档中。 对于3单步调试的观察,与理论上分析的结果进行比较,检验是否一致。如不一 致,分析原因。
通过ds和[address]访问




对栈操作

将ds加[address]读出的数据存压入栈中
课本习题结果

-
实验任务(2)
输入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
五、实验总结
- -a命令用汇编语言向内存中输入内容,-e命令则以十六进制形式改变内存中的内容,输入空格可以看到先前一个字节中存放的内容。
- 在内存指定区域输入指令后,用-r指令改变cs和ip寄存器中的数据,使其指向程序段开始地址,用-t指令可以住行顺序执行先前输入的指令。
- ss:sp指向栈顶,在栈空时指向存放第一个栈元素的后面一个字节。占据多个字节的数据在栈中存放遵循小端法,即低位数据放在地址低位,高位数据放在地址高位,且用低位地址作为数据的地址。
- -r指令加上寄存器名可以直接对寄存器值进行修改。
- ds,ss寄存器不能直接赋值,需要使用通用寄存器进行过渡。
浙公网安备 33010602011771号