一、实验目的
-
掌握8086CPU、寄存器、内存(包括栈空间)的基础知识
-
掌握汇编源程序组成与结构
-
理解和掌握寄存器间接寻址方式[bx]
-
掌握汇编指令mov, add, sub, jmp, push, pop,loop的用法,理解高级语言的表达和抽象机制
-
熟练掌握使用debug工具编写和调试x86汇编命令的方法
-
掌握汇编语言源程序编写→汇编→链接→调试的工具和方法
二、实验准备
-
复习教材1-5章
-
准备好软件实验环境
软件,及其安装说明文档,请从课程q群->实验文件夹下载。
-
熟悉工具用法
-
debug工具用法,参照:
- 教材实验1「1 预备知识:Debug的使用」
- 教材实验2 「1 预备知识:Debug的使用」
-
文档「debug工具简介及用法.pdf」。可从课程q群->实验文件夹下载。
-
masm、link及运行可执行程序的方法,参照教材第4章。
-
四、实验结论
1. 实验任务1
自行练习,掌握工具用法。此部分无需写实验结论。
如练习中遇到、发现问题,使用搜索引擎,以及,和同学讨论后,都暂时未能得到解决或释疑,可以写
入这一部分。共大家一起讨论。
实验一:
1. 使用a指令将指令写入内存中,用u查看看结果如下:
- 使用t命令执行如下:
- 求2的8次方
- 在内存b810:0中写入 01 01 02 02 03 03 04 04,实验结果如下:
实验2:
- 输入程序:
-
执行结果
见书。
2. 实验任务2
- 通过d命令查看ROM生产日期:,在最后的数据段,显示生成日期为1992/01/01
- 通过e命令修改生成日期,失败
3. 实验任务3
-
给出在debug中使用e命令修改内存单元的命令,及,效果截图
-
给出在debug中使用f命令批量填充内存单元的命令,及,效果截图
-
尝试修改内存单元,或,数据后的效果截图
- 使用e命令修改内存
- 使用f命令批量填充内存单元
4. 实验任务4
根据在debug环境中调试观察结果,填空并回答问题。
-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 执行后,寄存器(sp) = _2E_
push [2] ; 执行后,寄存器(sp) = _2C_
push [4] ; 执行后,寄存器(sp) = _2A_
push [6] ; 执行后,寄存器(sp) = _28_
pop [6] ; 执行后,寄存器(sp) = _2A_
pop [4] ; 执行后,寄存器(sp) = _2C_
pop [2] ; 执行后,寄存器(sp) = _2E_
pop [0] ; 执行后,寄存器(sp) = _30_
问题1:
栈顶的物理地址是:0022fH,逻辑地址:0;
问题2:
问题3:
数据没有变化。
问题4:
数据有变换,数据的顺序颠倒了。
5. 实验任务5
回答问题1和问题2。
问题1:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的?
问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。
问题1:
是的,使用t命令只会执行一条命令。再次使用t命令,mov sp 30将会执行。
问题2:
第二处划划线的内容刚好存储的是cs,ip的地址
6.实验任务6
1.代码的源程序
assume cs:code
code segment
start:
mov cx,10
mov dl,'0'
s: mov ah,2
int 21h
add dl,1
loop s
mov ah,4ch
int 21h
code ends
end start
2.masm,link,执行的截图
3.debug查看PSP内容
PSP的内容指的是程序段前面的256字节的保护空间,如下图所示,就是数据段寄存器ds中的地址和程序段地址之间的差距。
前两个字节的内容是CD 20.
需要复习PSP相关的知识点。
7.实验任务7
- 代码
因为需要实现程序复制,根据上下文可以判断出ds指向的是复制前程序的地址,所以ds的值就是程序段的段地址cs,
cx在循环中是循环次数,因为程序是每次复制一个字节,所以循环的次数就是程序的长度cx
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,20h
mov es,ax
mov bx,0
mov cx,cx
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end