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

 

三、实验内容

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

 

四、实验结论

 

实验一  P35~P46

实验任务(1)

使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。

因为机器码数据较多,所以只用前4行实验。

机器码 汇编指令

b8  20  4e

mov ax,4E20H
05  16  14 add ax,1416H
bb  00  20 mov bx,2000H
01  d8 add ax,bx

 

 

 

 

 

 

 

对前两行,我使用了E命令写入(指定了CS为1000,IP为0)

用R命令查看寄存器的内容

 

 

 

并通过T命令逐步单步调试,得到结果如下:

需要注意的是,T命令在没有参数的情况下会从当前的CS:IP开始调试,所以查看了当前CS和IP的值并修改为1000:0。

同时也可以对T命令追加参数 : t=1000:0

用R命令写入:

并通过T命令逐步单步调试,得到结果如下:

实验任务(2)

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

用A命令写入:

 因为单步调试较多,所以只截调试开始和调试出正确结果的部分:

通过多次加法,实现乘法的计算。

实验任务(3)

查看内存中存放的内容:PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它

尝试修改,并没有成功:

因为,ROM是只读的,无法用E命令修改。

实验任务(4)

修改了内存后出现的现象:

改变其中的数据,图案发生变化:

改变地址,图案位置变化:

实验二  P71~P75

 为了便于分析结果,

① 在使用 a 命令输入指令调试之前,先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H

② 将 P74 实验任务(1)中第1行的 mov ax, ffff → 改为 mov ax, 0022

实验任务(1)

① 使用 E命令修改内存单元0022:0~0022:f 中的数据分别为50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H,并通过D命令查看是否正确写入。

用A命令输入指令:

用t命令单步调试:

与预估的结果相符:(这图片我也不知道怎么成这样了)

 

 

实验任务(2)

① 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,
及修改后查看的部分

用R命令查看寄存器初始值:

用T命令单步调试:

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

前三行指令是给栈顶的段地址ss和偏移地址sp赋初值,因为不能直接把常数直接赋值给段寄存器所以先输入通用寄存器,在复制如段寄存器。

初始时,栈顶是2000:0010;栈底是2000:000E。

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

后8位存放了放入栈中的数据,

 

而前8位临时存放了需要写入栈中的数据。

posted @ 2020-10-12 21:55  无名的路人  阅读(181)  评论(3编辑  收藏  举报