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