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, чтобы скрыть исключение точности.

Другие вопросы по тегам