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

3. 结合教材实验1(P35)和课程QQ群文件中的文档,学习debug工具用法。

 

三、实验内容

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

 

四、实验结论

1、教材实验1结论

此部分书写内容:

教材实验1中[2.实验任务](P45)

实验任务(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命令和a命令两种方式,写入内存。用t命令单步调试。

用e命令将指令写入内存;再用d命令查看内存单元;然后用u命令进行反汇编,查看对应的汇编指令。用r命令查看寄存器,发现CS=073f,IP=0100。用r命令修改CS和IP的值为上述指令的内存地址,再次查看。使用t命令逐条执行,观察CS和IP值的变化。

 ②用a命令将指令写入内存

a命令后面不带参数时,CS和IP的值是默认的。使用带参数的a命令,可以在指定的内存中写入指令。

指令写完后,需要修改CS和IP的值,得到指定的内存单元,再用t命令逐条执行。 用t命令逐条执行,观察CS和IP值的变化。

实验任务(2)

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

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

用a命令写入以上三条指令,并通过t命令逐条执行,利用这3条指令计算2的8次方(十六进制表示为:0100H)。注意:修改CS和IP的值。t命令调试开始界面截图:t命令调试结束界面截图:

 实验任务(3)

查看内存中的内容。

PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。尝试通过e命令修改这个生产日期,再用d命令查看,发现并没有成功修改。

说明:因为ROM是只读寄存器,只能读不能写,所以生产日期不能成功被修改。

 实验任务(4)

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

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

请读者先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。

  • 不改变地址,改变数据:

 

 

 

 

  •  不改变数据,改变地址:

 

 

 

 

 说明:因为A0000H~BFFFFH是8086的显存地址空间,向该地址空间中写入数据时,数据被写入显存中,然后会被显卡输出到显示器上。

2、教材实验2结论

此部分书写内容:

教材实验2中「2. 实验任务」(P74)

实验任务(1)

先用d命令查看内存单元0022:0~0022f中的数据;再用e命令修改该内部才能单元中的数据;修改完后,再用d命令查看数据是否正确写入。

使用a命令输入P74的指令 

③使用t命令对每一行指令进行单步调试

 

 

 

根据指令执行的实际情况,对各个寄存器的结果进行填空。对于③单步调试的观察,与理论上分析的结果进行比较,检验是否一致,如不一致,分析原因。

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

push [4]        ;sp=00FE ;修改的内存单元的地址是0022:00FE 内容为5554
push [6]        ;sp=00FC ;修改的内存单元的地址是0022:00FC 内容为5756

通过对③单步调试的观察,与理论分析的结果比较,发现两者一致。

实验任务(2)

使用a命令输入图3.19的指令,并用e命令修改2000:0~2000:f的值,再通过d命令查看修改后的数据。

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

 

 

 以文字方式陈述:

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

mov ax,2000    ;不能直接向段寄存器SS中送入数据,所以用ax中转
mov ss,ax      ;设置栈的段地址,SS=2000H
mov sp,10      ;设置栈顶的偏移地址,因为栈为空,所以sp=0010H

初始时栈顶是SS:SP→2000:0010,栈底是2000:000E。

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

将2000:0~2000:f这段空间当做栈,当指令执行时,栈中不仅可以暂时存储指令的CS和IP值,还可以暂时保存ax寄存器和标志寄存器中的一些数据。

 

posted @ 2020-10-11 00:27  whr09  阅读(175)  评论(4)    收藏  举报