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

四、实验结论

1. 教材实验1结论 此部分书写内容: 教材实验1中「2. 实验任务」(P45)

实验任务(1) 机器码数据较多,只用前4行实验即可。 用t命令和a命令两种方式,写入内存。用t命令单步调试。

机器码 汇编指令
b8 20 4e mov ax,4E20H
05 16 14 add ax,1416H
bb 00 20 mov bx,2000H
01 d8 add ax,bx

用e命令将指令写入内存,并用d命令查看,同时使用u命令反汇编

用a命令写入指令

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

在T命令执行时,注意CS:IP的指向,可以用r命令修改cs:ip的值,也可以对T命令追加参数 : t=0:200

 

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

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

用a命令写入:

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

通过加法的不断跳转从而实现乘法,2^8=16^2  即0100H

 

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

通过D指令查看到是1992-01-01年的生产日期

尝试修改:

通过E指令试图改变它但是没有成功,因为C0000~FFFFF为各类ROM地址空间,该部分内容只可读取,不可改变。

实验任务(4) 向内存从B8100H开始的单元中填写数据,如:

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

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

填写不同内容:

改变地址:

在该内存填写数据不同,显示的图形和颜色不同;修改的地址不同,显示的位置不同。A0000~BFFFF为显存地址空间,向该部分中写入的数据,会被显示卡输出到显示器上。 

2. 教材实验2结论 此部分书写内容: 教材实验2中「2. 实验任务」(P74)

实验任务(1)

① 截图记录:使用 e 命令修改 内存单元0022:0~0022:f 中的数据,及修改后查看是否正确 写入的操作

 

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

 

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

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

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

 

实验任务(2)

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

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

指令mov sp,10被自动执行,现阶段我们可了解:Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。

其中2000:0~2000:f发生改变的内容中,01A3未知,0B39,0108是cs,ip,而2000指的是ax

这里ax寄存器的内容发生改变 ax=3123     cs:ip=0B39:010B

执行完push ax后,ax=3123入栈,ax,ip,cs的值上移

执行mov ax,3366后,ax的值发生改变

执行完push ax后,ax=3366入栈,ax,ip,cs的值上移,遵守栈的后进先出原则,3366在3123之前

 以文字方式陈述:

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

mov ax,2000 //将2000送入ax
mov ss,ax //将2000送入ss
mov sp,10 //初始化栈顶,将栈顶偏移地址设置为0010

初始化时栈顶为2000:0010,栈底为2000:000E

 

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

为了保证栈的完整性,CPU将与栈相关的变量一起存到了该内存空间内,如ax,cs,ip等

Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。

posted @ 2020-10-14 22:40  无问夕故  阅读(90)  评论(2编辑  收藏  举报