2011-01-06 82 views
2

我试图将32位浮点数转换为扩展精度80位浮点数。 我正在使用MSVC x86。我试着下面的内联汇编代码:将32位浮点数转换为IEEE 80位

void Convert32To80(float *value, void *outValue) 
{ 
    __asm 
    { 
     fld float ptr [value]; 
     fstp tbyte ptr [outValue]; 
    } 
} 

这里,void *outValue是一个缓冲区是大到足以容纳10个字节。 这看起来很适合我,但它运行时会崩溃。

任何帮助表示赞赏!

+0

“运行时崩溃”。你会得到什么具体的错误? – James 2011-01-06 12:18:03

+0

我没有得到具体的错误。这是一个从托管代码加载的C++/CLI dll(它是ASM的东西,其他内联ASM存根工作正常)。我得到这个: “运行时遇到了一个致命错误,错误的地址是0x64f9fca1,线程0x1904,错误代码是0xc0000005,这个错误可能是CLR或不安全或不安全的错误,可验证的用户代码部分这个错误的常见来源包括COM-interop或PInvoke的用户编组错误,这可能会破坏堆栈。“ – Janiels 2011-01-06 12:21:46

+1

您需要与调试器一起检查哪条指令导致崩溃。也许你的outValue不好(NULL或类似的东西)? – Suma 2011-01-06 12:50:29

回答

3

OK,这应该这样做:

void Convert32To80(float *value, void *outValue) 
{ 
    __asm 
    { 
     mov eax,dword ptr [value] 
     fld dword ptr [eax] 
     mov ecx,dword ptr [outValue] 
     fstp tbyte ptr [ecx] 
    } 
} 

我所做的只是写了一些C代码做相同的,但对于一个浮到双转换,看了看dissasembly,然后进行修改是必要的。

请注意,我不是MSVC的专家,我不能100%确定我可以使用EAX和ECX寄存器而不保存/恢复它们。其他人可能知道更多并提供更正。

1

更新注为后人:显然,MSVC 2010没有类型为80bit的浮点类型,所以在C或C++代码一起的

float inValue = 666.666f; 
long double outValue = (long double)inValue; 

线条明显的解决方案不起作用,你实际上被迫直接使用汇编语言。

相关问题