我是这样理解的:
如果按我改写的代码的思路,那么书中栈的使用情况是这样的:
1、原中断例程入口地址入栈:
push es:[9*4]
push es:[9*4+2]
2、call delay时inc ah的IP入栈;
3、delay子程序中栈的使用情况:
push ax
push dx
pop dx
pop ax
ret后返回inc ah处执行代码。
4、因为ret后IP出栈,所以此时栈顶应指向最先入栈的原中断例程入口地址处,再使用如下指令将其恢复:
pop es:[9*4+2]
pop es:[9*4]
5、如果执行程序的过程中按下了ESC键,则调用新int 9中断例程,其中栈的使用情况如下:
(1)按下ESC键后引发9号中断过程,标志寄存器入栈,CS、IP入栈;
(2)执行中断例程:
push ax
push bx
push es
pushf
此处将标志寄存器IF、TF置0的代码省略;
call dword ptr ds:[0]指令时后一条代码的CS、IP入栈;
调用原来的int 9中断例程;
在原来的int 9中断例程中应该有返回(出栈)上一条call指令时入栈的CS、IP;
cmp al,1指令判断是否按下ESC键,如果按下改变颜色后恢复寄存器,否则直接恢复寄存器,并用iret还原进入新int 9中断例程前的现场。
从上面栈的使用情况来看,好像没有什么不对的地方啊...
另外1楼所说的"执行过程不一样"是指什么?能否解释得详细些... |