tsembrace 发表于 2011-9-14 16:38:59

王爽书里十五章新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
}

可这样看下来整个出入栈顺序不就都乱了么?我知道一定是我哪里搞错了,恳请各位帮忙解释一下,多谢!

小丫 发表于 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
}

tsembrace 发表于 2011-9-15 09:07:19

楼上的嘛意思?:L

深蓝 发表于 2011-9-15 18:23:40

还没学到这里。。。。。看看
页: [1]
查看完整版本: 王爽书里十五章新9号例程中出入栈的疑问