2

我有这个 Win32 代码:

fld x
fmul y
fstsw ax

似乎fmul没有清除 FPU 状态寄存器位,即如果溢出已经设置(ax& 8),那么它将在之后保持设置fmul。这是正确的行为吗?是否需要在 FPU 操作之后或之前清除状态?

即我想fmul会设置这个位,但它应该重置它吗?我在网上找不到答案。

4

1 回答 1

6

你敢打赌这是正确的行为。

来自8.1.3.3 x87 FPU Floating-Point Exception FlagsIntel® 64 and IA-32 Architectures Software Developer’s Manual第 1 卷:

异常标志是“粘性”位(一旦设置,它们将保持设置直到明确清除)。它们可以通过执行 FCLEX/FNCLEX(清除异常)指令、使用 FINIT/FNINIT 或 FSAVE/FNSAVE 指令重新初始化 x87 FPU 或使用 FRSTOR 或 FLDENV 指令覆盖标志来清除。

如果禁用 FPU 异常,则不需要重置这些标志。

于 2013-03-19T09:40:00.890 回答