我有一个像这样的示例代码:
global _start
section .text
_start:
div eax
int 0x80
编译运行后,输出为:
Floating point exception (core dumped)
我的问题是:
eax != 0 and eax == 0
?Floating point exception (core dumped)
的目的是什么?答案 0 :(得分:5)
该名称有点误导,因为您的代码段中没有浮点运算。
在C中,除以零是未定义的行为,这意味着您不能轻易地假定特定行为(或者更准确地说,您必须期望任何可能发生)。
在x86上,任何东西都是硬件异常。操作系统的主要职责之一是处理这些硬件异常。 Linux通过将SIGFPE
发送到违规进程来处理除以零。
大多数进程在除零后无法继续运行(因为程序应该继续使用什么值?)因此转储核心并使用表示使其中止的信号的返回值中止。
然后你的shell解释了你的pogram的返回值,并在你的终端上写了Floating point exception (core dumped)
。
尽管如此,它并不总是那样。像Java这样的虚拟机有一个div除零的处理程序,它会抛出一个特定于java的ArithmeticException
,你可以在不中止你的程序的情况下处理它。
在你的代码中,除以零是因为未初始化的eax
中有一个零。