我在下面的代码中遇到了问题。它是IA-32架构上的GAS asm语法。它在fsqrt
指令后生成算术异常。 SetDouble
是int
类型的值0x0200
,input
是一个浮点数。我正在使用gcc用-m32
标志编译它。有人可以指出我犯错的地方。
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
答案 0 :(得分:1)
将控制字设置为0x200会将FPU切换为双精度,并取消屏蔽包括精度异常在内的所有异常。对于大多数输入(可能除0之外的所有输入),fsqrt
将引发此异常,这就是您所看到的。
您可以将控制字设置为0x220,而不是屏蔽精度异常。