一.实验准备
1.为了便于验证实验结果,对「2. 实验任务」中的(1)做如下调整:
在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8
个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H
2.修改完成后,用d命令进行查看是否完成了修改
二.使用Debug,将书中的事例程序段写入内存,逐条执行,根据指令执行后的实际运行情况完成书中填空
1.用a命令将事例汇编指令写入内存(注:第 1 行的 mov ax, ffff → 改为 mov ax, 0021)
2.实验前根据理论知识进行书中内容填空
mov ax,0021 mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;ax = 3130 add ax,[2] ;ax = 6462 mov bx,[4] ;bx = 3534 add bx,[6] ;bx = 6C6A push ax ;sp = 00FE;修改的内存单元的地址是220FE内容为6462 push bx ;sp = 00FC;修改的内存单元的地址是220FC内容为6C6A pop ax ;sp = 00FE;ax = 6C6A pop bx ;sp = 0100;bx = 6462 push [4] ;sp = 00FE;修改的内存单元地址是220FE内容为3534 push[6] ;sp = 00FC;修改的内存单元地址是220FC内容为3736
3.在单步执行汇编指令前,先使用r命令查看寄存器的初始值
栈顶的初值为ss=073F,栈底的初值为sp=00FD
4.使用t命令进行单步逐条执行
这里面的代码中,在执行mov ss,ax后,应该待执行指令是mov sp,0100,但似乎跳过了这一句,而去待执行
下一句mov ax,[0].但对比观察后发现虽然mov sp,0100并没有显示待执行,实际上还是产生了执行了的效果,
sp的值被设为0100。可以看成mov ss,ax与mov sp,0100同时执行了
上面的执行语句中,出现了很多pop,push出栈,入栈语句,在入栈时sp = sp-2.在出栈时sp=sp+2
5.比对实验结果与理论填空
可以发现事先的填空内容与实验结果是一致的
三.仔细观察书中事例图的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变
1.按图中代码敲入
并用e命令修改2000:0~2000:f(第一条指令将ax的值设为2000H)内存单元的内容,用d指令查看是否修改成功
2.用r指令查看各寄存器初值
初始栈顶SS为073F,初始栈底SP是00FD,待执行语句为mov ax,2000
3.用t指令逐条执行
执行了mov ax,2000汇编指令,将ax寄存器的值设为2000,待执行指令 mov ss,ax
栈顶地址寄存器SS的值按指令设为了2000,在这里出现了上一个实验一样的情况,
在这里我们进行详细分析按逐条执行的顺序来说,下一条待执行指令应该是mov sp,10.
但这里似乎跳过了这条指令,待执行指令为mov ax,3123,经仔细比对寄存器内容
单步执行mov ss,ax前,ax = 2000;ss=073f;sp=00fd
单步执行mov ss,ax后,ax = 2000;ss=2000;sp=0010
发现SP的值被设为了10,也就是说mov ss,ax和mov sp,10同时执行了
一般情况下,用T命令执行一条指令后,会停止继续执行,显示出当前CPU各个寄存器
的状态和下一步要执行的指令,但T命令执行mov ss,ax指令时却是同下一条指令一同执行
了,根据上一个实验和这个实验猜测在修改栈段寄存器SS指令时会出现这种情况
经了解这种现象是由于中断机制造成的,Debug的T命令在执行修改寄存器SS的指令时,下一
条指令也紧接着被执行了。
执行了mov ax,3123将ax的值设为3123,待执行push ax
执行了push ax语句,将ax寄存器内容入栈,栈底寄存器sp相应的发生变化,待执行mov ax,3366
后面均按照逐步执行的顺序进行执行了
四.总结
通过此次实验理解并掌握了「栈」内存空间的特性和使用理解并掌握 8086 汇编指令
mov, add, sub, push, pop 的用法,切实体会到「栈」内存空间的复杂性,不仅要考虑到越界
,还发现了中断机制的存在,只是现在我们还无法深入了解中断机制,期待在后续课程的学习中能够
深入研究其内在原因。