汇编语言实验一

实验结论

任务1

安装DosBox

百度下载DosBox安装,打开界面如下,默认装载c盘下MYDEBUG作为当前目录。

- 百度下载MASM文件,将文件夹中的**MASM.EXE** **LINK.EXE**两个文件复制到MYDEBUG文件夹中就可以直接在DosBox中使用。

任务2

  1. 在debug中,使用d命令查看生产日期
  2. 使用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
  1. push [6] 指令执行结束后, pop [6] 指令执行结束前,使用d命令d 20:20 2f 查看此时栈空间的
    数据。
  2. 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,就是要循环的次数。

调试结果:复制成功

实验总结

  1. 汇编是一门需要实践的语言,只有充分练习才能充分理解。
  2. 当不知道程序长度的时候可以通过u命令反汇编数程序长度,对于不同命令有不同长度,熟悉之后可以直接看代码得出长度。用减法也可以算出长度,利用cx本身存放的就是代码长度的特性。
  3. 汇编语言从底层操纵计算机,功能更加强大,但是也付出了安全性的代价。
posted @ 2021-10-20 20:29  fyhtom  阅读(180)  评论(1)    收藏  举报