在除以零的中断处理程序中该怎么做?

2024-02-26

操作系统中断处理程序应该如何处理与编码错误相关的中断?

例如,我尝试除以 0 来测试我的中断,但我的中断处理程序被调用。然而,由于 div 指令没有成功执行,EIP 不会更新到它之后的下一条指令以及从中断处理程序返回后iret,它又回到了错误的地方div再次指导。

  mov ax, 3
  mov dl, 0
  div dl    ; go back here again and again

处理这个中断的正确方法是什么?我想到的几个办法:

  • Change dl到 0 以外的其他值。但是,我不确定是否dl如果发生事情,可以保留,并且中断例程应该在退出后恢复寄存器,并且我不认为通过提供错误的计算来默默地纠正错误是好的。

  • 之后检索下一条指令div。不过,我还没有想到有什么简单可靠的方法来获取下一步的指令。

  • 将当前包含返回地址的堆栈顶部修改为其他代码的地址。所以,我们不再回到过去div不再指导。


你是对的,在这种特殊中断的情况下,这些都不是特别好的事情。正如评论中提到的,由于您拥有指令的地址,因此您可以获取该地址处的任何内容,解码指令,然后将指针前进到下一个地址......但代码不会期望如此!

在 POSIX 操作系统中,SIGFPE 信号涵盖了这种异常行为。如果您正在编写操作系统并希望遵循 POSIX,那么您的中断处理程序应该将该信号发送到进程。如果进程有该信号的处理程序,则跳转到该处理程序并允许进程处理该信号(例如,这就是高级语言中的 try/catch 块的工作方式......现在您知道为什么异常很慢!)。如果没有信号处理程序,则应终止该进程(并重新输入调度程序以计算下一步要做什么......并希望它是 PID 1!)。

当然,这是您的操作系统,如果您不愿意,没有理由必须遵循 POSIX!如果您有其他一些奇特的方法来处理用户程序中的错误,那么您可以实现它。

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

在除以零的中断处理程序中该怎么做? 的相关文章

  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 不同GIT版本的GIT合并结果不同

    在不同的 GIT 版本上运行 merge 命令我们得到不同的结果 命令是 git merge no ff origin master codeline Results 版本2 1 4 gt 合并成功 版本1 7 1 gt 同一提交上的同一合
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • 操作系统崩溃的常见原因[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解 操作系统崩溃 不限于Windows崩溃 最常见的技术原因 从操作系统编程的角度 有哪些 我正在寻找一个不像 打开太多应用
  • 用于预乘 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
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • AVX-512 指令编码 - {er} 含义

    在 Intel x86 指令集参考中 有许多 AVX 512 指令在指令中具有可选的 er 例如 VADDPD 的一种形式定义为 EVEX NDS 512 66 0F W1 58 r VADDPD zmm1 k1 z zmm2 zmm3 m
  • 为什么在谈论线程和进程时,“不要同时格式化软盘”的评论很有趣?

    我正在阅读之间的区别线程和进程 https stackoverflow com questions 200469 what is the difference between a process and a thread并在第二个答案中发现
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • 小牛队 macports 安装过时

    当我升级到 OS X Mavericks 后 所有安装的端口都变得过时了 我无法再使用我的 gcc 请帮忙 The following installed ports are outdated bzip2 1 0 6 0 lt 1 0 6
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是

随机推荐

  • HTML5 本地存储中的项目何时过期?

    数据保存多长时间localStorage 作为 HTML5 中 DOM 存储的一部分 可用吗 我可以为本地存储的数据设置过期时间吗 我建议将时间戳存储在object您存储在 localStorage 中 var object value v
  • 使用 keras 库指定 Dense

    我稍微误解了如何为我的数据创建一个简单的序列 数据具有以下维度 X train shape 2369 12 y train shape 2369 X test shape 592 12 y test shape 592 这就是我创建模型的方
  • 如何在 JavaFX 的文本字段中添加提示文本

    我想在文本字段中添加一些提示文本 例如 姓名 或 姓氏 我像这样创建文本字段TextField userTextField new TextField 但我找不到如何做到这一点 在这里 我刚刚发现这个仅当用户开始输入时清除 JavaFX T
  • qpython 没有“gnu-readline”功能

    我已经在我的 Samsung Galaxy Appeal android 2 3 6 上安装了 qpython 但是解释器的命令行没有 readline 编辑功能 这使得它使用起来不切实际 这通常不是自动包含在内吗 这与当前活动的 Shel
  • 创建NotificationChannel会抛出IllegalArgumentException

    该应用程序适用于以前版本的 Android 但不适用于 Oreo 它是WebView with Notifications 我一直在研究这个错误 但没有发现任何类似的东西 堆栈跟踪 E AndroidRuntime FATAL EXCEPT
  • jQuery ajax post Uncaught RangeError:超出最大调用堆栈大小

    我在使用 jQuery ajax 时遇到问题 我有 JavaScript
  • 模板、类型名、lambda -> 依赖名称不依赖?

    考虑 template lt typename Something gt boost function
  • Angular:单击后禁用 ngFor 中的按钮

    我有一个
  • 如何在 Swift 4.0 中使用键值编码?

    我以前从未使用过Swift4 也不知道如何在其中使用KVC 我尝试用字典创建模型 代码如下 class Person NSObject var name String var age Int 0 init dict String Any s
  • 如何在生产环境中强制使用 https,而在开发环境中强制使用 http?

    我有一个 symfony2 应用程序 在产品服务器上 我希望所有路由都通过 https 进行 而在开发服务器上 我希望能够使用 http 我如何单独使用 symfony2 来实现这一目标 我不想触及网络服务器配置 我尝试将其添加到我的rou
  • GraphViz:仅修复节点的 y 位置

    我想固定节点的 y 位置 但根据力方向自动对齐 x 位置 每个 y 位置都是单独的 因为它对应于 y 轴上的一个坐标 并且有几千个节点 所以我认为为每个节点使用子图是不合理的 使用简单的力定向布局编写了我自己的 Java2D PDFGrap
  • 科尔多瓦蓝牙音箱没有声音

    我正在开发一个 Android 和 IOS 应用程序 该应用程序可以毫无问题地播放音频消息 我的问题如下 如果手机已经连接到蓝牙 启用并连接蓝牙 然后我启动应用程序并播放音频文件 在这种情况下 我在电话和蓝牙扬声器上都听不到任何声音 但是
  • Hadoop中数据是如何分割的

    Hadoop是否根据程序中设置的mapper数量来分割数据 也就是说 有一个大小为 500MB 的数据集 如果 Mapper 的数量为 200 个 假设 Hadoop 集群允许同时存在 200 个 Mapper 那么每个 Mapper 是否
  • 反应本机 UIExplorer 无法打开

    我正在尝试在 Xcode 上查看 UIExplorer 我已经按照这个例子做了 应该很简单 它说克隆react native cd到目录 npm install并运行npm start 但是 当我运行 npm start 时 出现以下错误
  • Python 类内的 main 调用

    我没有做过太多Python工作 来自C Java背景 所以请原谅我问这么一个简单的问题 我在 Eclipse 中使用 Pydev 来编写这个简单的程序 我想要它做的就是执行我的 main 函数 class Example if name m
  • Typo3 CKEditor 图片来自 FAL

    我使用 CKEditor 设置了全新的 TYPO3 8 7 4 安装 并且rte ckeditor image从 FAL 获取图像 在文档中rte ckeditor image它说 最大尺寸与魔法图像的配置有关 必须在 Page TSCon
  • npm 错误“Keccak 绑定编译失败。”安装松露时

    我尝试安装 Truffle 但出现以下错误 npm install g truffle C Users dany vandermeij AppData Roaming npm truffle gt C Users dany vanderme
  • 以编程方式在其他视图的底部添加子视图

    我创建了一个 UIView 并通过界面生成器向其中添加了一些 UIlabel 我想以编程方式将 UIView 添加到此视图 self view addSubview newView 问题是 newView 隐藏了我使用界面生成器创建的部分标
  • 从 Google+ API json 结果中的对象 -> 内容末尾删除“\ufeff”

    Google API 的结果是 ufeff附加到每个 内容 结果的末尾 我真的不知道为什么 从 json 结果中删除此 unicode 字符的最佳方法是什么 它正在生产一个 在我显示的一些输出中 例子 https developers go
  • 在除以零的中断处理程序中该怎么做?

    操作系统中断处理程序应该如何处理与编码错误相关的中断 例如 我尝试除以 0 来测试我的中断 但我的中断处理程序被调用 然而 由于 div 指令没有成功执行 EIP 不会更新到它之后的下一条指令以及从中断处理程序返回后iret 它又回到了错误