gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:25:14 27 4
gpt4 key购买 nike

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

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

  • 因此,当公共(public)处理程序进入时,堆栈已正确对齐并包含异常/中断号、错误代码(可能只是一个伪代码)、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 here : http://www.intel.com/products/processor/manuals/

    第 3 卷第 1 部分第 5 章描述了异常和中断处理。第 2 卷第 1 部分有 iret 的规范操作说明。

    关于assembly - 在从中断处理程序返回之前,我是否必须弹出某些异常推送到堆栈的错误代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/491613/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com