【问题标题】:Conditional eax != 0 and edx == 0?条件 eax != 0 和 edx == 0?
【发布时间】:2016-05-23 04:53:15
【问题描述】:

我有一个这样的示例代码:

global _start
section .text

_start:

div eax
int 0x80

编译运行后,输出为:

Floating point exception (core dumped)

我的问题是:

  1. 这是否以eax != 0 and eax == 0 为条件?
  2. Floating point exception (core dumped) 的目的是什么?

【问题讨论】:

标签: linux assembly x86 conditional nasm


【解决方案1】:

这个名字有点误导,因为你的代码 sn-p 中没有浮点运算。

在 C 中,除以零是未定义的行为,这意味着您不能以可移植的方式假设特定行为(或者更准确地说,您必须预期 任何事情 都可能发生)。

在 x86 上,任何东西都是硬件异常。操作系统的主要职责之一是处理这些硬件异常。 Linux 通过向违规进程发送信号 SIGFPE 来处理除以零。

大多数进程在被零除后无法继续运行(因为程序真的应该继续使用什么值?)因此转储核心并中止,返回值指示使其中止的信号。

然后你的 shell 解释了你的 pogram 的返回值并在你的终端上写了Floating point exception (core dumped)

但不一定总是这样。像 Java 这样的虚拟机有一个除以零的处理程序,它会抛出一个特定于 java 的ArithmeticException,您可以在不中止程序的情况下处理它。

在您的代码中,除以零是因为您未初始化的eax 中有一个零。

【讨论】:

  • div 如果%[r/e]dx(被除数的高半部分)大于或等于除数,也会出错,因为商不适合寄存器。
  • 如果可执行文件是动态链接的 (gcc nasm-output.o),那么动态链接器会在 _start 之前运行,并且会在一些寄存器中留下垃圾,包括 edx。 Linux 在新的execced 进程中将所有非 ABI 定义的寄存器归零,但为了避免泄漏内核信息,因此除零是另一个主要的可能性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 2020-07-17
  • 1970-01-01
  • 2012-12-10
  • 2016-12-17
  • 2017-04-05
相关资源
最近更新 更多