我可以用以下命令重置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()
的第二次调用来稍后恢复它。