一、实验名称
用机器指令和汇编指令编程以及汇编源程序编写-汇编-连接-调试
二、实验目的
- 理解栈的特性
- 掌握汇编语言源程序编写→汇编→链接→调试的方法
三、实验过程
教材实验二
实验任务(1)- 先用e命令按照要求将0020:0~0020:7连续八个内存单元进行修改,并用d命令查看。
- 用t命令单步调试。
- 在单步调试过程中,当有push和pop操作时,用d命令查看栈顶元素的值(SS:SP指向栈顶元素),并填写实验之后的所显示的结果(图中有错误)。在使用栈的时候,应时刻关注SS:SP的值。
PS(修改上图错误):
- 由上面的图可知,对比在执行PUSH AX之前2200:00f0 L15内存单元中的值,在执行PUSH AX之后,修改的内存单元的地址是2200:00FE 、2200:00FF,内容为6040H。
- 同样由上面的图可知,对比在执行PUSH BX之前2200:00f0 L15内存单元中的值,在执行PUSH BX之后,修改的内存单元的地址是2200:00FC 、2200:00FD,内容为E0C0H。
- 对比在执行PUSH [4]之前2200:00f0 L15内存单元中的值,在执行PUSH [4]之后,修改的内存单元的地址是2200:00FE 、2200:00FF,内容为6050H。在执行PUSH [6]之后,修改的内存单元的地址是2200:00FC 、2200:00FD,内容为8070H。
实验任务(2)
- 先将指令输入,然后用t命令单步调试,并且每一次调试后,用d命令查看2000:0~2000:f的内容。
由上述单步调试结果可发现,在进行push操作之前,内存单元2000:0~2000:f的值已经被改变了。仔细观察发现push操作之前,被改变的内存单元2000:0~2000:f的值有一部分是CS和IP寄存器的值。并且在后来的调试过程中,发现在内存单元2000:0~2000:f中都还有CS和IP两个寄存器的值。CS是代码段段寄存器,IP是指令指针寄存器,CS:IP指向了下一条即将执行的指令。
因此,推断,内存单元2000:0~2000:f的值的改变是因为CPU自动将CS和IP的值入栈了,以便记住下一条指令执行的地址。
- 先用e命令按照要求将0020:0~0020:7连续八个内存单元进行修改,并用d命令查看。
教材实验三
- 首先在Masm for windows 集成实验环境软件中输入源码,并保存运行。
- 在生成目标文件,以及可执行文件后,用t命令进行单步调试
- 第一张截图运行了如下三个指令,在执行POP AX指令之前,用d命令查看了对应内存单元的值,发现已经做了相应的改变。同时根据上一个实验任务,发现同样栈中同样存放着CS和IP的值。在这里,更加确认我在任务二中的推测。
- 第二张图中,执行了POP AX的指令,发现ax寄存器的值变成了0000,栈中仍然存在着CS和IP的值。
- 第三张截图中运行了PUSH BX以及POP AX的指令。
- 第四张图中,执行了POP BX等三条指令。最后程序运行结束。
- 课本第四章讲到,程序加载后,DS中存放着程序所在内存区的段地址,这个内存区的偏移地址是0,则程序所在的内存区的地址为DS:0。并且内存区的前256个字节中存放的是PSP,所以,从DS中可以得到PSP的段地址SA,PSP的偏移地址为0,则PSP的物理地址为SA*16+0。在截图中,我们发现DS为0760,所以PSP的头两个字节应该就是0760:0~0760:0内存单元中存放的值。
- 首先在Masm for windows 集成实验环境软件中输入源码,并保存运行。