|
发表于 2011-9-14 21:35:00
|
显示全部楼层
书上新例程的结构大致如下(列出主要涉及栈操作的代码):
{
push ax
push bx
push es
--------------------
pushf
call dword ptr... (这步是结合检测点15.1之后做的精简)
-----------------------
pop es
pop bx
pop ax
iret
}
首先,CPU检测到中断后,取中断类型码,然后:
pushf (TF=IF=0)
push cs
push ip
------------------------------
接着转到中断例程入口地址;中断例程通过iret返回,iret相当于:
pop ip
pop cs
popf
这个顺序应该没有问题吧。那结合开始提到的新例程,举个例子,如果CPU检测并转到新例程去执行,那完整的出入栈是否应该如下:
{
pushf (TF=IF=0)
push cs
push ip (以上是CPU检测到中断取类型码之后进行的操作,下面转入新例程)
----------------------
push ax
push bx
push es
--------------------------
...
pushf
(call dword ptr... 这步调用原中断例程,其中出入栈指令为iret,这步对栈的操作即等同于:)
pop ip
pop cs
popf
--------------------------------
...
pop es
pop bx
pop ax
iret
}
|
|