首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >软件产生的中断和软件产生的异常有什么区别?

软件产生的中断和软件产生的异常有什么区别?
EN

Stack Overflow用户
提问于 2016-11-09 07:14:00
回答 1查看 1.3K关注 0票数 2

我正在阅读英特尔手册3A第6章中断和异常处理。

中断和异常分别有3个源。

对于软件生成的中断,它说:

INT指令通过提供中断向量号作为操作数,允许从软件内部产生中断。例如,INT 35指令强制对中断处理程序的中断35进行隐式调用。从0到255的任何中断向量都可以用作此指令中的参数。但是,如果使用处理器的预定义NMI向量,则处理器的响应将不同于以正常方式生成的NMI中断的响应。如果在此指令中使用向量号2( NMI向量),则调用NMI中断处理程序,但处理器的NMI处理硬件未被激活。在带有INT指令的软件中生成的中断不能被EFLAGS寄存器中的IF标志所掩盖。

对于软件生成的异常,它说:

INTO、INT 3和绑定指令允许在软件中生成异常。这些指令允许在指令流中的点执行异常条件的检查。例如,INT 3将生成一个断点异常。INT指令可以用来模拟软件中的异常,但也有其局限性。如果INT n为体系结构定义的异常之一提供了一个向量,则处理器会向正确的向量(访问异常处理程序)生成一个中断,但不会在堆栈上推送错误代码。即使相关硬件生成的异常通常会产生错误代码,也是这样。在处理异常时,异常处理程序仍将尝试从堆栈中弹出错误代码。由于没有推送错误代码,处理程序将弹出并丢弃EIP (而不是缺少的错误代码)。这将返回错误的位置。

那么,有什么区别呢?似乎两者都利用了int n指令。如何判断它是在汇编代码中生成异常,还是生成中断?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-09 12:50:34

在x86体系结构中,异常作为中断处理程序处理,名义上是用中断处理程序处理。

因此,中断和例外是重叠的术语,后者是前者的一种。

从0到31的中断号是为CPU异常保留的,例如,中断号0是#DE (除法错误),13是#GP (一般保护)。

当CPU检测到应该出现异常的情况时(比如对非当前页面的访问),它执行一系列任务。

首先,如果需要,它会推送一个错误代码,一些异常(比如#PF和#GP)会这样做,而有些(比如#DE)则不会。

英特尔手册3第6.15节列出了所有异常及其最终错误代码。

其次,它“调用”适当的中断处理程序,这就像一个远程调用,但使用EFLAGS推到堆栈上。

int n只执行第二步,它调用一个中断,但不推送任何错误代码,因为硬件中首先没有错误条件(而且因为int n在错误代码概念之前就已经存在了)。

因此,它可以用来模拟异常,软件最终要推一个适当的错误代码。

当您在代码中看到int n时,它从来都不是例外。它是一个中断,最终用于将控制流引导到特定的OS异常处理程序中。

琐事:int3 (没有空格)是特殊的,因为它被编码为CC,只有一个字节(普通的int nCD imm8)。这对于调试非常有用,因为调试器可以将它放在代码段的任何位置。

into只生成异常的#(如果OF = 1 )。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40501713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档