【问题标题】:division by zero in a standalone program在独立程序中除以零
【发布时间】:2016-08-26 16:58:13
【问题描述】:

我们有一个引导加载程序,我们有一个程序,该程序断言 0 来注册 RAX。之后用DIV命令,自己划分寄存器RAX。

当然,引导加载程序会加载程序。

我知道任何汇编程序在此状态下都会出错,但程序是原始二进制文件。所以我们可以很容易地用十六进制编辑器编写这个程序,因为这个程序只有两条指令。

在这种状态下会发生什么?

【问题讨论】:

  • 也许检查一下你的 CPU 供应商的文档..
  • Intel Core i5 处理器,当然还有架构 x86_64
  • 如果您要进行任何严肃的 x86(-64) 开发,请获取英特尔® 64 和 IA-32 架构软件开发人员手册。 DIV 的行为记录在那里。
  • 你为什么希望汇编器给出警告?
  • 通常,您要么捕获将要调用的中断,要么自己测试除数。

标签: assembly divide-by-zero


【解决方案1】:

根据预订 Intel® 64 and IA-32 Architectures Software Developer's Manual:

每当一条指令试图除以一个指令时,处理器就会报告被零除异常 有限的非零操作数为 0。被零除异常的屏蔽响应是设置 ZE 标志并返回 用操作数符号的异或符号签名的无穷大。如果除零异常没有被屏蔽, 设置 ZE 标志,调用软件异常处理程序,并且操作数保持不变。


所以,我们为此设置了标志。当我们尝试这样做时,该标志将被修改,并且累加器寄存器的值不会发生变化。

【讨论】:

  • 当浮点指令除以零时会发生这种情况。它不适用于 DIV 指令。
猜你喜欢
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 2012-03-29
  • 2015-01-09
  • 2014-06-06
相关资源
最近更新 更多