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

时间:2016-05-23 04:53:15

标签: linux assembly x86 conditional nasm

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

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

1 个答案:

答案 0 :(得分:5)

该名称有点误导,因为您的代码段中没有浮点运算。

在C中,除以零是未定义的行为,这意味着您不能轻易地假定特定行为(或者更准确地说,您必须期望任何可能发生)。

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

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

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

尽管如此,它并不总是那样。像Java这样的虚拟机有一个div除零的处理程序,它会抛出一个特定于java的ArithmeticException,你可以在不中止你的程序的情况下处理它。

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