微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我已经加载了一个包含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指令的规范.

原文地址:https://www.jb51.cc/java/127465.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐