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