2008-10-10 49 views
5

我可以重置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寄存器。

也许我不知道?也许德尔福在需要时重置它们? 我在这个问题0123pal的博客。

回答

7
uses 
    SysUtils; 

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

您用于更改它们的相同功能:_controlfp()。如果您传递的掩码为0,则当前值不会被更改,但会返回 - 保存它,然后使用第二次调用_controlfp()以稍后恢复。

+0

不错的主意,问题是我不明白要在面具等放什么,但delphi方法Set8087CW abowe是非常好的。 – neslekkiM 2008-10-14 14:43:56