当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在从中断处理程序返回之前,是否必须弹出由某些异常推送到堆栈的错误代码?》经验,为你挑选了1个好方法。

我已经加载了一个包含256个条目的idt表,它们都指向类似的处理程序:

对于例外8和10-14,推送异常编号(这些异常会自动推送错误代码)

对于其他人,推送"虚拟"错误代码和异常号码;

然后跳转到一个公共处理程序

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

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

问题:

我是否必须将错误代码留在堆栈上,以便将错误代码放在那里?如果是这样,如何iret确定是否必须弹出错误代码?

一旦我启用中断,我总是得到异常8(双故障),但一切都运行正常(我正在开发一个爱好操作系统).这是正常行为还是某处有错误?

Nathan Fellm.. 13

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

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

错误代码作为双字或字被压入堆栈(取决于默认中断,陷阱或任务门大小).为了保持堆栈对齐双字推送,错误代码的上半部分是保留的.请注意,执行IRET指令以从异常处理程序返回时,不会弹出错误代码,因此处理程序必须在执行返回之前删除错误代码.

您可以在此处找到IA-32软件开发人员手册 :http://www.intel.com/products/processor/manuals/

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



1> Nathan Fellm..:

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

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

错误代码作为双字或字被压入堆栈(取决于默认中断,陷阱或任务门大小).为了保持堆栈对齐双字推送,错误代码的上半部分是保留的.请注意,执行IRET指令以从异常处理程序返回时,不会弹出错误代码,因此处理程序必须在执行返回之前删除错误代码.

您可以在此处找到IA-32软件开发人员手册 :http://www.intel.com/products/processor/manuals/

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

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有