如何设置和恢复FPU CTRL寄存器



我可以用以下命令重置FPU的CTRL寄存器:

http://support.microsoft.com/kb/326219

但是,我如何保存当前寄存器,并在以后恢复它们呢?

它来自.net代码。。

我正在做的是从Delphi调用一个.net dll作为COM模块。在delphi中检查Ctrl寄存器会得到一个值,在.net代码中使用controlfp进行检查会得到另一个值。我需要的,是在本质上做这件事:

_controlfp(_CW_DEFAULT, 0xfffff); 

因此,我在.net代码中的浮点计算不会崩溃,但我希望在返回时恢复Ctrl寄存器。

也许我没有?也许德尔福在需要的时候重置了它们?我在这里写了关于这个问题的博客。

uses
   SysUtils;
var
   SavedCW: Word;
begin
   SavedCW := Get8087CW;
   try
     Set8087CW($027f);
     // Call .NET code here
   finally
     Set8087CW(SavedCW);
   end;
end;

用于更改它们的函数相同:_controlfp()。如果传入掩码0,则不会更改当前值,但会返回-保存它,然后使用对_controlfp()的第二次调用来稍后恢复它。

最新更新