2011-01-06 119 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; 

線條明顯的解決方案不起作用,你實際上被迫直接使用匯編語言。

相關問題