程序集 – 在从中断处理程序返回之前,是否必须弹出由某些异常推送到堆栈的错误代码?

前端之家收集整理的这篇文章主要介绍了程序集 – 在从中断处理程序返回之前,是否必须弹出由某些异常推送到堆栈的错误代码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经加载了一个包含256个条目的idt表,它们都指向类似的处理程序:

>对于例外8和10-14,推送例外号码(这些例外会自动推送错误代码)
>对于其他人,推送“虚拟”错误代码和异常编号;
>然后跳转到一个公共处理程序

因此,当公共处理程序进入时,堆栈正确对齐并包含异常/中断号,错误代码(可能只是虚拟代码),eflags,cs和eip.

我的问题是关于从中断处理程序返回.我从堆栈中取出异常编号和错误代码后使用iret返回,但这对异常nr 8不起作用;如果我把错误代码留在堆栈上,那么它返回正常!

问题:

>我是否必须将错误代码留在堆栈上,以查找将错误代码放在那里的异常?如果是这样,iret如何确定是否必须弹出错误代码
>一旦我启用中断,我总是得到异常8(双重故障),但一切都运行正常(我正在开发一个爱好操作系统).这是正常行为还是某处有错误

解决方法

如果cpu自动推送错误代码,则处理程序必须在iret之前弹出它.如果是故障,陷阱或外部中断,iret指令不知道你来自哪里.它总是一样,并假设堆栈上没有错误代码.

引自SDM(软件开发人员手册),第3卷,第5章,第5.13节标题错误代码

The error code is pushed on the stack
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 herehttp://www.intel.com/products/processor/manuals/

第3卷第1部分,第5章描述了异常和中断处理.第2卷第1部分有iret指令的规范.

猜你在找的Java相关文章