FPU IA-32 SIGFPE, Арифметическое исключение
У меня проблема с этим кодом ниже. Это синтаксис GAS asm в архитектуре IA-32. Генерирует арифметическое исключение, после fsqrt
инструкция. SetDouble
является int
тип значения 0x0200
а также input
это число с плавающей точкой. Я собираю это с -m32
флаг с помощью gcc. Может кто-то указать, где я допустил ошибку.
pushl %ebp
movl %esp,%ebp
finit
fldcw SetDouble
fld input
fld input
fmulp
fld1
faddp
fsqrt
fld1
fxch
fsubp
fstp output
mov %ebp,%esp
pop %ebp
1 ответ
Решение
Установка контрольного слова в 0x200 переключает FPU в двойную точность и снимает маску со всех исключений, включая исключение точности. Таким образом, для большинства входов (вероятно, все, кроме 0) fsqrt
поднимет это исключение, и это то, что вы видите.
Вместо этого вы можете установить управляющее слово на 0x220, чтобы скрыть исключение точности.