王爽书里十五章新9号例程中出入栈的疑问
书上新例程的结构大致如下(列出主要涉及栈操作的代码):{
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
}
可这样看下来整个出入栈顺序不就都乱了么?我知道一定是我哪里搞错了,恳请各位帮忙解释一下,多谢! 书上新例程的结构大致如下(列出主要涉及栈操作的代码):
{
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
}
楼上的嘛意思?:L 还没学到这里。。。。。看看
页:
[1]