一、实验目的
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
实验任务一、
用E命令和A命令以两种方式将P45书本指令写入内存。
(注:这里只写入书本前4行指令-->b8 20 4e 05 16 14 bb 00 20 01 d8)
(1)E命令
1、用e命令将指令写入内存1000:0,这里输入后可以使用u命令显示1000:0地址后的每一条指令的地址、机器指令、机器指令所对应的汇编指令。

2、使用r cs与r ip指令将CS:IP的值修改到10000H的位置并使用t命令单步运行查看结果:

3、这里在使用t命令时也可以t后加上数字(16进制数),表示一次执行多条指令:

(3)A命令
1、使用a命令向2000:0内存中写入汇编指令并使用d命令查看2000:0内存中的内容:

2、使用t命令从2000:0地址单元开始执行指令,需要使用-t =2000:0让cs:ip指向2000:0
(当然这里也可以先用rcs和rip指令设置指向2000:0):

实验任务二、
将mov ax,1;add ax,ax;jmp 2000:0003;
这三条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
1、这里t命令要执行10(16进制数)次。

实验任务三、
查看FFF00H~FFFFFH的某几个单元中的ROM中写有的一个生产日期
1、使用d命令查看FFF0:0000后的内存单元:

2、根据图片可以看出生产日期应该是在内存单元FFF0:00F5~FFF0:00FC中,使用e命令修改此处的机器码:

3、结果说明:从图片中可以看出e命令修改此处机器码失败,地址C0000~FFFFF的内存单元中写入数据的操作是无效的,因为这等于改写只读存储器中的内容。
实验任务四、
向内存从B8100H开始的单元中填写数据,观察结果,后改变填写的地址,观察结果。
1、使用e命令从B8100H开始的单元中填写数据如:-e B810:0000 01 01 02 02 03 03 04 04:

2、改变填写的地址,再来观察结果的变化:

3、结果说明:A0000~BFFFF为显存地址空间,向此单元写数据,就是向显存中写入数据,这些数据会被显卡输出到显示器特定区域。
教材实验2
实验任务一、
1、使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H,及修改后查看是否正确写入的操作:

2、使用 a 命令输入的 p74 指令,如下图所示:

3、每一行指令的单步调试结果:




书本内容填空:
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:00FE 内容为:A4A2
push bx ;sp=00FC; 修改的内存单元的地址是:2200:00FC 内容为:ACAA
pop ax ;sp=00FE; ax=ACAA
pop bx ;sp=0010; bx=A4A2
push [4] ;sp=00FE; 修改的内存单元的地址是:2200:00FE 内容为:5554
push [6] ;sp=00FC; 修改的内存单元的地址是:2200:00FC 内容为:5756
检验得结果一致。
实验任务二、
① 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值, 及修改后查看的部分

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



① 前3行汇编指令的功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别是?
mov ax,2000:把2000H存入ax寄存器中。
mov ss,ax:把ax寄存器中的值存入堆栈段寄存器ss中。
mov sp,10:把10H存入堆栈指针寄存器sp中,表示当前堆栈栈顶的偏移地址。
初始时栈顶为2000:0010,栈底为2000:000e,此时为空栈
② 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。
分析发现,2000:0000~2000:000f这段地址空间是存放的是栈的数据,其中包括栈的此时栈顶的数据,cs:ip以及栈此时的数据内容。
posted on
浙公网安备 33010602011771号