实验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

  1. 结合教材实验1(P35)和课程QQ群文件中的文档,学习debug工具用法。在课程QQ群文件->工具软件及相关文档说明文件夹,有如下文档:

关于汇编实验软件的简要说明.pdf debug工具简介及用法.pdf

 

三、实验内容

 

1.  教材实验1(P35)

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

提示&说明*:

这里共有4个小的实验任务。每一项任务在教材前序内容或者练习中都有提示线索。所以,建议你 先认真完成「二、实验准备」中要求的内容及debug工具练习,再着手做「2.   实验任务」,会更高效。比如:

实验任务(1):可参照教材P41-43(7) E命令和U命令完成; 实验任务(2):与教材P20的检测点(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为0,IP为200)

 

 

 

 

从下一条指令的位置开始,通过A命令输入汇编指令。

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

 

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

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

 

实验任务(2)

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

1 mov ax,1
2 add ax,ax
3 jmp 2000:0003

 

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

 

 

 

 

 

 

 

 

 

 

通过加法(add)实现了乘法,进而实现了次方的运算。

实验任务(3)

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

 

通过D指令查看到是1992-01-01年的生产日期,通过E指令试图改变它但是没有成功,因为ROM是只读存储器,不能够修改。

实验任务(4)

向内存从B8100H开始的单元中填写数据,如:

 

-e B810:0000 01 01 02 02 03 03 04 04

 

输入样例得到的结果如下:

 

改变输入进内存的值:

 

输入的值改变了,得到的图案也变化了。

再改变输入的地址:

可以看到图案的位置也变了。

 

实验二  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 命令输入的 p74 指令


③ 截图记录:每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)

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

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:0100内容为A4A2
push bx sp=00FC;修改的内存单元地址是2200:00FE内容为ACAA
pop ax sp=00FE;ax=ACAA
pop bx sp=0100;bx=A4A2
push [4] sp=00FE;修改的内存单元地址是2200:0100内容为5554
push [6] sp=00FC;修改的内存单元地址是2200:00FC内容为5756

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

结果与预期是一致的,总结:数据出栈和入栈的规则为入栈时 sp=sp-2,出栈时 sp=sp+2。

而当修改寄存器ss的时,会产生中断将现场保护,下一条指令也会接着被执行。

实验任务(2)

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


② 单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看
2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元
值的变化,并思考原因。

第二行代码因为对ss进行了修改,产生了中断保护下一条代码也被接着执行了。

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

前三行指令是给栈顶的段地址ss和偏移地址sp赋初值,即指定栈顶的位置,因为不能直接把常数直接赋值给段段寄存器所以使用通用寄存器ax作为中转。

初始时,栈顶是2000:0010;栈底是2000:000E。
② 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。

在栈顶所在位置的的内存单元中存放的始终是AX 中的值即3123;

对于地址从2000:0到f单元的值,是从指令mov sp,10开始的,从变化的数值看,他们记录了CS的高位和低位、IP的高位和低位、AH、AL、SS的高位;

  而在执行了后几条指令后也发现出现了数据33、66,这就是指令mov ax 3366对应的值,应该是在数据传输时,借助了其空间作为临时用。

 

posted @ 2020-10-11 21:34  Liu_Wei  阅读(213)  评论(2)    收藏  举报