在x64中如何编写空中断服务处理程序?

问题描述 投票:1回答:1

我已经阅读了AMD64开发者手册中关于中断例程的内容。根据手册的规定。

如果中断或异常推送了错误代码,中断处理程序必须从堆栈中弹出错误代码。IRET通过从堆栈中弹出它们保存的值并将其放入各自的寄存器中,来恢复被中断程序的rIP、CS和rFLAGS。

因此,一个空的ISR处理程序会不会是这样的ASM代码?

add rsp, 4       ;pop err code off stack
iretq

我假设错误代码的大小是4个字节,正如其他网站告诉我的那样。我很确定这是完全错误的,但一些指导会有帮助。

exception assembly x86-64 interrupt interrupt-handling
1个回答
4
投票

长模式(x64)中的错误代码大小是8个字节长。因此,您需要向堆栈指针添加4个字节,而不是添加8个字节。

此外,并非所有的异常都会将错误代码推送到堆栈上。在这里可以找到一个表格,其中包含了哪些异常会推送错误代码,哪些不会。https:/wiki.osdev.orgExceptions

如果一个处理程序没有推送错误代码,空处理程序只是一个 iretq 指令从处理程序中返回。如果它确实推送了一个错误代码,我们只需在堆栈指针上添加8个字节,然后从处理程序返回。

add rsp, 8
iretq

谢谢 @Michael Petch

© www.soinside.com 2019 - 2024. All rights reserved.