条件 eax != 0 和 edx == 0?

Conditional eax != 0 and edx == 0?

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

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) 的目的是什么?

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

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

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

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

然后您的 shell 解释了程序的 return 值并在您的终端上写入 Floating point exception (core dumped)

虽然不必总是那样。像 Java 这样的虚拟机有一个除以零的处理程序,它会抛出一个 java-specific ArithmeticException,你可以在不中止程序的情况下处理它。

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