实验内容
任务一:使用debug将程序段写入内存,逐条执行后填空。
① 在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8 个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H
② 将 P74 实验任务(1)中第 1 行的 mov ax, ffff → 改为 mov ax, 0021
(1)先用e命令写入数据,之后d命令显示查看,再使用a命令逐一写入指令:
(2)r命令后再逐条执行:
这里0021:0=3130(高位31,低位30),所以ax=3130
push ax就是将ax=6462存入栈,地址为sp-2=00FE
push bx 将bx=6C6A存到sp-2=00FC
pop出栈就是将ax,bx交换数据
得到ax=6C6A,bx=6462
push [4] 将0021:4=3534存到栈,地址为sp-2=00FE
push [6] 将0021:6=3736存到栈,地址为sp-2=00FC
任务二:观察实验过程后分析
(1)a命令输入指令,将2000:0~f 的值修改为0后显示查看:
(2)r命令后逐条执行,每次执行显示一次内存:
通过ax将ss的值修改为2000之后,就是mov sp,10这条指令了。但图中没有出现这条语句,实验任务之前的一部分内容解释了,凡是修改栈段寄存器SS指令的下一条指令也会紧接被执行,这是中断机制,大概是为了能控制栈段大小。
而2000:0~f的值之所以改变 是因为对定义栈段时SS,IP, CS的值进行了暂存,0020对应ss=2000, 0801对应ip=0108, 3F07对应cs=073F。
总结与体会
纸上得来终觉浅,对于书本上学过一遍的东西,不经过自己亲自实验大概真的挺难记住的。这一部分实验让我对于push和pop这两条指令有了稍加清晰的理解,但栈方面的不少问题还要花时间弄明白透彻。