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

2024-01-14

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

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

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

INT n 指令允许从内部产生中断 软件通过提供中断向量号作为操作数。为了 例如,INT 35 指令强制隐式调用 中断 35 的中断处理程序。来自的任何中断向量 0 至 255 可用作该指令中的参数。如果 使用处理器的预定义 NMI 矢量,但是,响应 该处理器与 NMI 的处理器不同 中断以正常方式产生。如果向量号 2(NMI 该指令中使用了向量),NMI中断处理程序是 调用,但处理器的 NMI 处理硬件未激活。 使用 INT n 指令在软件中生成的中断不能被 由 EFLAGS 寄存器中的 IF 标志屏蔽。

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

INTO、INT 3 和 BOUND 指令允许例外 在软件中生成。这些指令允许检查异常 在指令流中的点执行的条件。为了 例如,INT 3 会导致生成断点异常。情报局 n 指令可用于模拟软件中的异常;但那里 是一个限制。如果 INT n 为其中之一提供向量 架构定义的异常,处理器生成一个 中断到正确的向量(以访问异常处理程序)但是 不会将错误代码压入堆栈。即使 相关的硬件生成的异常通常会产生错误 代码。异常处理程序仍会尝试弹出错误代码 处理异常时从堆栈中取出。因为没有错误代码 按下后,处理程序将弹出并丢弃 EIP(就地 缺少的错误代码)。这会导致返回错误 地点。

那么,有什么区别呢?似乎两者都利用了int n操作说明。如何判断一段汇编代码中是否产生异常或中断?


在 x86 架构中,异常被作为中断来处理,名义上是通过中断处理程序来处理的。
所以中断和异常是重叠的术语,后者是前者的一种。

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

当 CPU 检测到应引发异常的情况(例如访问不存在的页面)时,它会执行一系列任务。

首先,如果需要,它会推送错误代码,有些异常(如#PF 和#GP)会推送错误代码,有些(如#DE)则不会。
第 6.15 条英特尔手册3 https://www-ssl.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html列出所有异常及其最终错误代码。

其次,它“调用”适当的中断处理程序,这类似于远调用,但具有EFLAGS压入堆栈。

int n仅执行第二步,它调用中断但不推送任何错误代码,因为硬件中首先没有错误条件(并且因为int n在这个概念之前就已经存在了错误代码).
所以它可以用来emulate异常情况下,软件最终必须推送适当的错误代码。

当你看到int n在代码中,它是never一个例外。它是一个中断,最终用于将控制流引导到特定的操作系统异常处理程序。


Trivia: int3(没有空格)很特殊,因为它被编码为CC这只是一个字节(正常int n is CD imm8)。这对于调试很有用,因为调试器可以将其放置在代码段中的任何位置。
into仅在以下情况下生成 #OF 异常:OF = 1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

软件生成的中断和软件生成的异常有什么区别? 的相关文章

随机推荐

  • 在 Azure 上部署 Angular 5 build:ssr

    我已经从此处找到的角度通用模板开始构建了我的项目 通用启动器 https github com angular universal starter 我正在尝试将 ssr 版本部署为 azure web 应用程序 我的代码在 VSTS 上 在
  • 如何从 IEEE Python 浮点转换为 Microsoft Basic 浮点

    我获得了 Python 浮点值 需要将其转换为 Microsoft Basic Float MBF 格式 幸运的是 从互联网上得到了一些代码 可以实现相反的功能 def fmsbin2ieee self bytes Convert an a
  • 为什么 std::string 不定义乘法或文字? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JAX-RS Rest 服务停止在 Eclipse Glassfish 上部署

    我使用 Eclipse 在 Glassfish 4 1 1 上开发 Jersey JAX RS 应用程序大约一年了 今天早些时候 我对某些类进行了一些正常的更改 但是当我尝试进行构建时 Eclipse 没有更新这些类 我在 Stack Ov
  • 为什么应该将 CSRF 令牌放入 JWT 令牌中?

    我想对 JWT 代币和 CSRF 提出疑问风暴之路帖子 https stormpath com blog where to store your jwts cookies vs html5 web storage 解释了将 JWT 存储在
  • Android - 如何将后续视图发送回去

    我向 LinearLayout 添加一些视图 顶部略有重叠 代码如下 viewHolder linearLayout removeAllViews for int i 0 i lt conversation getPreviousMessa
  • 如何使用 AutoFixture 生成编译时未知的任意类型的存根对象

    我可以像这样获取构造函数参数的类型 Type type paramInfo ParameterType 现在我想从这种类型创建存根对象 有可能吗 我尝试使用自动固定装置 public TObject Stub
  • 在 Windows 上将 Xdebug 和 PhpStorm 与 Docker 容器结合使用

    我正在尝试使用 PhpStorm 使 Xdebug 适用于 Windows 上的 Docker 容器 我阅读了不同的文章和其他线程 但它仍然不起作用 在 docker compose yaml 中 我的应用程序容器有以下配置 version
  • Material UI 自动完成上的 Typescript 相等问题

    数据存储为 iso gb label United Kingdom country United Kingdom iso fr label France country France 传递给自动完成的值是 iso gb label Unit
  • odoo 9 - 如何限制 one2many 不显示表单视图

    我有一个 Many2many 它使用 one2many 小部件 我设置了 mode tree 并使用 editable bottom 这在编辑模式下按预期工作 但是在查看模式下 如果用户单击一行 它将在表单视图中打开该行 我如何防止这种情况
  • 如何在

    这个问题在这里已经有答案了 我有一个在 XAML 中声明的按钮 它具有 MouseDown 和 MouseUp 属性 它们都调用指定的方法
  • 通过排序快速插入/删除的数据结构

    我正在拼命寻找一种数据结构 允许我执行大量插入 几乎同样多的删除 可能是相同的数量级 以及非常快速地查找最高 或最低 可以使用其中任何一个 值 删除始终只会影响最高 或最低 值 问题是这些值必须进行排序 并且在任何时候我都可以在其他两个之间
  • RestAdapter(改造)在android中无法解析

    所以我尝试在我的项目中使用 Retrofit 正如该网站所说 我已经包括了compile com squareup retrofit retrofit 2 0 0 beta1 in build gradle 我正在阅读此教程link htt
  • Windows - 无法强制关闭网络文件句柄 - 无法关闭系统(Pid 4)文件句柄

    首先 很抱歉问了这么长的问题 但我想提供足够的细节 概要 在 Windows 中 似乎无法强制关闭通过网络共享打开的文件句柄 因此 通过网络共享打开的文件无法移动 重命名 删除 我用的是Win 7 问题 任何人都可以看到我做错了什么 或者有
  • 以角度动态更改 css 变量

    在我的角度项目中 我在顶层定义了一些 css 变量样式 scss像这样的文件 我在很多地方使用这些变量来保持整个主题的一致性 root theme color 1 f7f7f7 theme color 2 ec4d3b theme colo
  • Android启动意图查看apk

    在我的应用程序中 我下载一个 apk 并将其保存到 SD 卡 然后我想开始安装该 apk 我正在使用以下代码来尝试此操作 Intent intent new Intent intent setAction Intent ACTION VIE
  • Mathematica 中的变换分布

    我开发了一些代码来从 LogNormalDistribution 和 StableDistribution 的乘积生成随机变量 LNStableRV Alpha Beta Gamma Sigma Delta n Module LNRV SD
  • 如何找到相交矩形的交点矩形(点)

    如果我有两个相交的矩形 x1 y1 x2 y2 x3 y3 x4 y4 由两个顶点描述 如何找到一个由它们的交集产生的矩形 得到这些矩形相交的 2 个点 编程语言并不重要 可能是伪代码 PS 矩形与 OXY 平行 你可以使用矩形 交集 ht
  • 让 VertexRenderingFunction 缩放(不缩放)

    我在自定义 VertexRenderingFunction 以不同尺寸显示不同图形时遇到问题 下面是一个示例 默认的顶点渲染函数具有所需的行为 因为顶点在所有图中看起来都相同 有什么建议如何使用自定义顶点来实现这一点吗 source yar
  • 软件生成的中断和软件生成的异常有什么区别?

    我正在阅读英特尔手册 3A 第 6 章中断和异常处理 中断和异常分别有3个来源 对于软件生成的中断 它说 INT n 指令允许从内部产生中断 软件通过提供中断向量号作为操作数 为了 例如 INT 35 指令强制隐式调用 中断 35 的中断处