>对于例外8和10-14,推送例外号码(这些例外会自动推送错误代码)
>对于其他人,推送“虚拟”错误代码和异常编号;
>然后跳转到一个公共处理程序
因此,当公共处理程序进入时,堆栈正确对齐并包含异常/中断号,错误代码(可能只是虚拟代码),eflags,cs和eip.
我的问题是关于从中断处理程序返回.我从堆栈中取出异常编号和错误代码后使用iret返回,但这对异常nr 8不起作用;如果我把错误代码留在堆栈上,那么它返回正常!
问题:
>我是否必须将错误代码留在堆栈上,以查找将错误代码放在那里的异常?如果是这样,iret如何确定是否必须弹出错误代码?
>一旦我启用中断,我总是得到异常8(双重故障),但一切都运行正常(我正在开发一个爱好操作系统).这是正常行为还是某处有错误?
解决方法
引自SDM(软件开发人员手册),第3卷,第5章,第5.13节标题为错误代码:
The error code is pushed on the stack
@H_403_34@
as a doubleword or word (depending on
the default interrupt,trap,or task
gate size). To keep the stack aligned
for doubleword pushes,the upper half
of the error code is reserved. Note
that the error code is not popped when
the IRET instruction is executed to
return from an exception handler,so
the handler must remove the error code
before executing a return.你可以找到IA-32 Software Developer’s Manual here:http://www.intel.com/products/processor/manuals/
第3卷第1部分,第5章描述了异常和中断处理.第2卷第1部分有iret指令的规范.