实验二用机器指令和汇编指令编程
1. 教材实验 2(P71)
(1)练习「1.预备知识:Debug 的使用」
(2)在练习基础上,完成「2. 实验任务」补充:
为了便于验证实验结果,对「2. 实验任务」中的(1)做如下两点调整:
①在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8 个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H
②将 P74 实验任务(1)中第 1 行的 mov ax, ffff → 改为 mov ax, 0021 实验前,请理论上分析指令执行后各个填空处的值,并记录下来。
实验时,通过在 debug 中调试,观察实验结果与理论分析是否一致,如不一致,尝试。
发现问题所在,并分析原因。
p71练习实验截图如下:
练习实验分析:mov sp,10被执行了吗?
在程序执行前,ax=0000,ss=0b39,sp=ffee
在用T命令单步执行mov ax,2000后,ax=2000; ss=0b39; sp=ffee
在用T命令单步执行mov ss,ax后,ax=2000;ss=2000;sp=0010
注意,在用T命令单步执行mov ss,ax 前,ss=0b39,sp=ffee,而执行后ss=2000,sp=0010。ss变为2000是正常的,这正是mov ss,ax的执行结果。sp变为0010是在mov ss,ax之后,因为它就是mov ss,ax的下一条指令。显然,在用T命令执行mov ss,ax的时候,它的下一条指令 mov sp,10也紧接着执行了。
实验任务(1):
① 截图记录:使用 e 命令修改 0021:0~0021:f 数据,及修改后查看是否正确写入的操作
② 截图记录:使用 a 命令输入的 p74 指令
③ 截图记录:每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)
④ P74 中指令执行后各个寄存器填空结果,以在文档中手工标注或手机拍照截图方式复制在文档中。 对于③单步调试的观察,与理论上分析的结果进行比较,检验是否一致。
实验二是在机房做的,当时没有查看修改后地址。在自己电脑重新修改截图如下:
前半部分输入a命令实验截图如下:
t命令单步执行截图如下:
第一部分得出结论:
ax=3130
ax=6462
bx=3534
bx=6C6A
后两部分结果如下:
sp=00FE;修改的内存单元的地址是 2200:FE到FF 内容为62 64
ax入栈 sp=sp-2=0100H-2 =00FEH
sp=00FC;修改的内存单元的地址是 2200:FC到FD 内容为6A 6C
bx入栈 sp=sp-2=00FEH-2=00FCH
sp=00FE;ax=6C6A
sp=0100;bx=6462
push [4] sp=00FE;修改的内存单元的地址是 2200:FE到FF 内容为 34 35
push [6] sp=00FC;修改的内存单元的地址是 2200:FC到FD 内容为 36 37
由于疏忽,手写时错误的将得出结论的步骤弄错了一步,导致结果出现了上下相错的偏差,应注意。
实验任务(2):
① 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,及修改后查看的部分
② 单步调试每一行汇编指令的截图。且每一条指令单步调试后,都使用 d 命令查看
2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元值的变化,并思考原因。
用自己电脑做分步步骤如下:
分析结论:
初始的栈顶和栈底分别是2000:0010和2000:0010。
如练习实验(3)一样,执行中断例程时,CPU会将一些中断例程使用的的寄存器变量自动压栈到栈中,包括了上述的寄存器变量的值,命令紧接着执行。