汇编语言实验一
实验结论
任务1
安装DosBox
百度下载DosBox安装,打开界面如下,默认装载c盘下MYDEBUG作为当前目录。
-
百度下载MASM文件,将文件夹中的**MASM.EXE** **LINK.EXE**两个文件复制到MYDEBUG文件夹中就可以直接在DosBox中使用。
任务2
- 在debug中,使用d命令查看生产日期
- 使用e命令修改生产时期所在的内存单元,修改后,再次使用d命令查看
-
尝试使用e命令修改,发现无法修改
-
原因分析:ROM是只读存储器,无法修改
任务3
实验发现这是一个显示红心的数据
-
更改地址和数据
任务4
-
1. 单步执行,在执行push指令和pop指令时,观察并记录栈顶偏移地址的寄存器sp值的变化情况。
-
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
观察可以发现push的时候SP减小两字,8086CPU的栈操作都是以字作为单位的。
栈底是栈空间地址最大的位置,SP始终指向当前栈顶元素,也就是栈顶。
PUSH 时 SP = SP - 2
POP时 SP = SP + 2
- push [6] 指令执行结束后, pop [6] 指令执行结束前,使用d命令d 20:20 2f 查看此时栈空间的
数据。 - pop [0] 指令执行结束后,使用d命令d 20:0 7 查看此时数据空间内的数据是否有变化。
-
4. 如果把最后四条指令改成截图中的顺序, pop [6] 指令执行结束后,使用d命令d 20:0 7 查看此时数据空间内的数据是否有变化。
-
逆序了
任务5
-
**问题1:使用t命令单步执行mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令mov
sp, 30 是什么时候执行的?**
答:通过观察mov ss,ax后寄存器的值可以发现,sp已经变成0030h了,所以此时mov sp, 30也同时执行完毕了。
问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。
-
答:观察发现第一次执行mov ss, ax时,会在给定的位置20:2f处放入当前的指令段的地址,同时会在20:28处放入当前ax的值,后续push数据时,sp指针正常移动,依次入栈数据。同时指定段地址和ax值依次向前覆盖,如果在此时改动ax中的数据,则上文描述放入的ax值也会改变。原因可能是因为中断没有保护现场等问题。
任务6
输出内容如下:
-
-
经验证确实是CD 20
任务7
缺代码行的补全1:mov ax, cs
因为要把 mov ax, 4c00h 之前的指令复制到内存 0:200 开始的连续的内存单元, 这些都是代码段的内容,代码段的段地址存档在cs中。
缺代码行的补全2:mov cx, 17H

因为cx中本身存放的是全部代码的大小,通过反汇编发现所有的指令的长度是23字节, 16进制是17H,就是要循环的次数。
调试结果:复制成功

实验总结
- 汇编是一门需要实践的语言,只有充分练习才能充分理解。
- 当不知道程序长度的时候可以通过u命令反汇编数程序长度,对于不同命令有不同长度,熟悉之后可以直接看代码得出长度。用减法也可以算出长度,利用cx本身存放的就是代码长度的特性。
- 汇编语言从底层操纵计算机,功能更加强大,但是也付出了安全性的代价。

浙公网安备 33010602011771号