在从中断处理程序返回之前,是否必须弹出由某些异常压入堆栈的错误代码?

2024-02-06

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

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

因此,当公共处理程序进入时,堆栈会正确对齐并包含异常/中断号、错误代码(可能只是一个虚拟代码)、eflags、cs 和 eip。

我的问题是关于从中断处理程序返回的。我用iret从堆栈中取出异常号和错误代码后返回,但这不适用于异常nr 8;如果我将错误代码留在堆栈上,那么它会正常返回!

问题:

  • 对于将错误代码放在那里的异常,我是否必须将错误代码留在堆栈上?如果是这样,如何iret确定是否必须弹出错误代码?
  • 一旦我启用中断,我总是会收到异常 8(双重错误),但随后一切都运行良好(我正在开发一个业余爱好操作系统)。这是正常行为还是我在某个地方有错误?

如果 CPU 自动推送错误代码,则处理程序must在之前弹出它iret. The iret指令不知道你来自哪里,是错误、陷阱还是外部中断。它总是做同样的事情,并且假设堆栈上没有错误代码。

引用 SDM(软件开发人员手册)第 3 卷第 5 章第 5.13 节,标题为“错误代码”:

将错误代码压入堆栈 作为双字或字(取决于 默认中断、陷阱或任务 浇口尺寸)。保持堆栈对齐 对于双字推送,上半部分 错误代码的保留。笔记 错误代码不会弹出 IRET指令被执行到 从异常处理程序返回,所以 处理程序必须删除错误代码 在执行返回之前。

您可以找到IA-32 软件开发人员手册 http://www.intel.com/products/processor/manuals/ here http://www.intel.com/products/processor/manuals/: http://www.intel.com/products/processor/manuals/ http://www.intel.com/products/processor/manuals/

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

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

在从中断处理程序返回之前,是否必须弹出由某些异常压入堆栈的错误代码? 的相关文章

  • 缓冲区溢出(与)缓冲区溢出(与)堆栈溢出[重复]

    这个问题在这里已经有答案了 可能的重复 堆栈溢出和缓冲区溢出有什么区别 https stackoverflow com questions 1120575 what is the difference between a stack ove
  • 汇编中如何计算负数

    我是汇编新手 我有一个关于如何表示负数的问题 我有三个 DWORDS 变量 比方说 result DWORD 0 i DWORD 3 j DWORD 5 我想计算这个公式 结果 i j 8 但是 当我执行 i j 时 由于符号 结果将是一个
  • 为什么这个 C++ 包装类没有被内联掉?

    EDIT 我的构建系统出了问题 我还在弄清楚到底是什么 但是gcc产生了奇怪的结果 尽管它是 cpp文件 但是一旦我使用了g 然后它按预期工作 对于我一直遇到麻烦的事情来说 这是一个非常精简的测试用例 其中使用数字包装类 我认为会内联 使我
  • 如果物理内存的大小是2^32-1,那么虚拟内存的大小是多少?

    我知道物理地址是 32 位长 但是如何通过这些信息找出虚拟内存的大小 虚拟内存地址空间的总大小为2 32x86架构和更大 目前约为 2 48 x64建筑学 然而 操作系统通常会保留一部分空间 因此 32 位应用程序不一定能一次寻址 4GB
  • 从 Java 访问文件名中带有空格的文件

    我想从java程序访问文件名中有空格的目录中的文件 但它不访问文件 场景是我在文件中有文件名 iread 从该文件中读取文件名 但无法在 java 中打开带有空格的文件 我们使用 File exist 函数来检查文件是否存在 但它返回 fa
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • 如何使用 GWT 检测操作系统?

    Basically what I want to know is to find out if my GWT application is running on a MacOS or any other operating system t
  • 为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

    在尝试优化有限差分代码所需的未对齐读取时 我更改了未对齐的负载 如下所示 m128 pm1 mm loadu ps H k 1 进入这个对齐的读取 随机播放代码 m128 p0 mm load ps H k m128 pm4 mm load
  • 全局键盘挂钩的合法用途是什么?

    除了仅应由操作系统提供的应用程序启动快捷方式之外 Windows 键盘挂钩等东西的合法用途是什么 在我看来 我们只在键盘记录器之类的事情上遇到问题 因为操作系统提供了钩子来执行除操作系统内核本身之外的任何情况下任何人都不允许执行的操作 编辑
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • 将两个 32 位整数向量相乘,生成 32 位结果元素向量

    将每个 32 位条目乘以 2 的最佳方法是什么 mm256i互相注册 mm256 mul epu32不是我正在寻找的 因为它产生 64 位输出 我想要每个 32 位输入元素都有一个 32 位结果 而且 我确信两个 32 位值的乘法不会溢出
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 不同GIT版本的GIT合并结果不同

    在不同的 GIT 版本上运行 merge 命令我们得到不同的结果 命令是 git merge no ff origin master codeline Results 版本2 1 4 gt 合并成功 版本1 7 1 gt 同一提交上的同一合
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • 为什么在强度降低乘法和循环进位加法之后,这段代码的执行速度会变慢?

    我正在读书阿格纳 雾 https en wikipedia org wiki Agner Fog s 优化手册 https en wikipedia org wiki Agner Fog Optimization 我遇到了这个例子 doub
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令

随机推荐

  • 将 bootstrap 3 glypicons 与 webjar 和 jsf2.2 一起使用

    我正在尝试在 jsf 2 2 中使用 bootstrap 和 glypicons 制作一个简单的页面 我已经包含了 webjar 的引导依赖项 打开 jar 我可以看到字体文件存在 将应用程序部署到 wildfly 时 引导 css 可以正
  • 使用 jQuery 更改输入字段的类型

    document ready function login box password field password attr type text password val Password 这应该会改变 password输入字段 带有id
  • 如何为布局设置不同的主题

    我已经为整个应用程序设置了默认主题 它在 styles xml 中定义如下 我还定义了一个黑暗主题 在清单中 它被声明为应用程序的主主题 浅色主题
  • 我可以制作 postgreSQL 可再发行版吗?

    我不了解开源 我阅读了一些许可证 但我想了解您的经验 我的目标是编写我的软件并使用 postgreSQL 制作可再发行版 我可以不支付任何费用吗 我读到一些关于 MySQL 的内容 如果你在你的软件版本中重新分发它 你需要付费 我不是律师
  • Android布局:在TextView和android:drawableStart上——设置图标的大小?

    Lars Vogel 的教程SQLite 自己的ContentProvider和Loader对待办事项列表使用以下布局 检查http www vogella com articles AndroidSQLite article html t
  • 属性构造函数的默认值?

    我收到这个错误 错误CS0182 属性参数必须是属性参数类型的常量表达式 typeof 表达式或数组创建表达式 当我尝试写这样的东西时 AttributeUsage AttributeTargets Method AllowMultiple
  • 使用 Watir 控制新选项卡操作? (红宝石)

    我使用 watir 进行自动化测试 在运行一些表格后 会在新选项卡中打开一个图表 但 watir 似乎无法识别新的当前选项卡 并继续通过原始浏览器选项卡进行搜索 有什么方法可以告诉 watir 你想使用哪个选项卡吗 Watir 不关心新页面
  • 在Java中,永久代空间垃圾被收集吗?

    我读过 Perm gen 或永久代 空间不会被垃圾收集 但是 在 CMS 集合中 我可以在 GC 日志中看到一些类正在卸载 那么perm gen垃圾是在完全收集还是CMS收集期间收集的呢 永久代与堆的其他部分一样被垃圾收集 这里需要注意的是
  • XCode 8 和 Swift 3 中的 UserDefaults.standard set nil 错误

    这似乎是一个错误 我正在尝试删除默认值中的现有值 UserDefaults standard set nil forKey test me let val UserDefaults standard object forKey test m
  • Socket-CAN虚拟总线

    如何创建多个虚拟套接字并将它们链接在一起以创建虚拟总线 我想模拟一个应用程序 其中许多节点通过 CAN 相互通信 所有你需要的是cangw工具来自can utils https github com linux can can utils
  • D 退出语句

    D有没有退出语句 类似于java python c c 中的退出语句 哪一个会 令人震惊 退出程序的执行 就像是exit 如果你想exit 然后使用Cexit功能 import core stdc stdlib void main exit
  • rcpp源码Cpp编译器设置

    我正在使用 Rcpp 来加速在 R 3 4 Windows7 中重复调用的函数 我希望更改编译器设置 当我打电话时 sourceCpp scoreseq1 1 cc verbose TRUE 部分输出内容如下 C RBuildTools 3
  • 如何阻止用户在未登录的情况下无法获取文件

    我正在开发网站 其中有一些文件放置在文件夹中 并且还为用户提供了这些文件的链接 以便他们可以下载这些文件 我只是允许经过身份验证的用户 而不是全部 但好像有任何用户知道该链接文件直接将其放在地址栏中并获取该文件 任何人都可以告诉我如何确保该
  • div 内文本中的新行[重复]

    这个问题在这里已经有答案了 在文本区域中 有新行 例如 013 但是如何在不使用 html 纯文本 如 n 的情况下对 div 元素执行此操作 您可以使用 CSS 强制 HTML 将新行识别为换行符 只需设置white space财产给pr
  • Groovy 动态添加带参数的方法

    我想向现有类 java util Date 添加一个方法 格式化字符串 fmt 我的代码如下 Date metaClass toFormatString String fmt SimpleDateFormat sdf new SimpleD
  • 触发 DOMContentLoaded 后是否应用样式?

    考虑以下 HTML 文档
  • Python cx_freeze 4.3.4:设置 targetName 导致错误

    我对 cx freeze 非常陌生 我试图更好地理解它 我有这个 setup py 文件 import sys from cx Freeze import setup Executable Dependencies are automati
  • 从信号处理程序中引发异常

    我们有一个处理错误报告许多方面的库 我的任务是将这个库移植到 Linux 上 当运行我的小测试套件时 其中一项测试失败了 下面显示了测试的简化版本 Compiler 4 1 1 20070105 RedHat 4 1 1 52 Output
  • laravel4 响应速度很慢,加载时间很长

    我进行了大量搜索 但没有任何解决方案适合我 首先 我在同一台服务器上有两个项目 一个使用 CodeIgniter 另一个使用 Laravel The one which uses Laravel occasionally loads ver
  • 在从中断处理程序返回之前,是否必须弹出由某些异常压入堆栈的错误代码?

    我加载了一个包含 256 个条目的 idt 表 所有条目都指向类似的处理程序 对于异常 8 和 10 14 推送异常编号 这些异常会自动推送错误代码 对于其他人 推送 虚拟 错误代码和异常编号 然后跳转到一个公共处理程序 因此 当公共处理程