我已经加载了一个包含256个条目的idt表,所有条目都指向类似的处理程序:
因此,当公共处理程序进入时,堆栈正确地对齐,并包含异常/中断号、错误代码(可能只是一个虚拟的)、标志、cs和eip。
我的问题是从中断处理程序返回。在从堆栈中取出异常号和错误代码后,我使用iret返回,但是这对异常nr 8无效;如果我将错误代码留在堆栈中,那么它返回的很好!
问题:
iret如何确定它是否必须弹出错误代码?发布于 2009-01-29 13:50:57
如果CPU自动推送错误代码,处理程序必须在iret之前将其弹出。iret指令不知道您从哪里来,如果是故障、陷阱或外部中断。它总是这样做,并且假设堆栈上没有错误代码。
引用SDM (软件开发人员手册)第3卷第5章第5.13节题为错误代码:
将错误代码作为双字或双字推送到堆栈上(取决于默认的中断、陷阱或任务门大小)。为了保持堆栈对齐以进行双字推送,将保留错误代码的上半部分。注意,在执行IRET指令从异常处理程序返回时不会弹出错误代码,因此处理程序在执行返回之前必须删除错误代码。
您可以找到IA-32软件开发人员手册 这里:http://www.intel.com/products/processor/manuals/
第3卷第1部分第5章描述异常和中断处理。第2卷第1部分有iret指令的规范。
发布于 2009-01-29 14:02:10
发布于 2015-01-25 19:53:26
当我启用中断时,我在“双故障”方面也遇到了类似的问题。嗯,他们看起来像双重错误,但他们真的是计时器中断!
双故障是中断号8。
不幸的是,默认的PIC配置会以中断号(DEFAULT_PIC_BASE + TIMER_OFFSET) = (8 + 0) = 8中断计时器。
屏蔽我的所有PIC中断(直到我准备好正确配置PIC),沉默这些双故障相似的定时器中断。
(图片要求CPU在产生下一个中断之前确认中断。由于您的代码没有确认最初的计时器中断,PIC再也没有给您提供任何!这就是为什么你只有一个,而不是一个人可能期望的万万)。
https://stackoverflow.com/questions/491613
复制相似问题