我已经阅读了AMD64开发者手册中关于中断例程的内容。根据手册的规定。
如果中断或异常推送了错误代码,中断处理程序必须从堆栈中弹出错误代码。IRET通过从堆栈中弹出它们保存的值并将其放入各自的寄存器中,来恢复被中断程序的rIP、CS和rFLAGS。
因此,一个空的ISR处理程序会不会是这样的ASM代码?
add rsp, 4 ;pop err code off stack
iretq
我假设错误代码的大小是4个字节,正如其他网站告诉我的那样。我很确定这是完全错误的,但一些指导会有帮助。
长模式(x64)中的错误代码大小是8个字节长。因此,您需要向堆栈指针添加4个字节,而不是添加8个字节。
此外,并非所有的异常都会将错误代码推送到堆栈上。在这里可以找到一个表格,其中包含了哪些异常会推送错误代码,哪些不会。https:/wiki.osdev.orgExceptions
如果一个处理程序没有推送错误代码,空处理程序只是一个 iretq
指令从处理程序中返回。如果它确实推送了一个错误代码,我们只需在堆栈指针上添加8个字节,然后从处理程序返回。
add rsp, 8
iretq
谢谢 @Michael Petch