Преобразование 32-разрядного числа с плавающей запятой в IEEE 80-разрядное - PullRequest
2 голосов
/ 06 января 2011

Я пытаюсь преобразовать 32-разрядное значение с плавающей точкой в ​​расширенное значение с 80-разрядным значением.Я использую MSVC x86.Я попробовал следующий встроенный код ASM:

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

Здесь void *outValue - буфер, достаточно большой, чтобы вместить 10 байтов.Это выглядит правильно для меня, но это сбой при запуске.

Любая помощь приветствуется!

Ответы [ 2 ]

3 голосов
/ 06 января 2011

ОК, это должно сделать это:

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, чтобы сделать то же самое, но для преобразования с плавающей запятой в двойное, посмотрел на разборку и затем изменил при необходимости.

Обратите внимание, что я не специалист по MSVC, и я не уверен на 100%, что могу использовать регистры EAX и ECX без их сохранения / восстановления. Другие могут знать больше и предлагать исправления.

1 голос
/ 06 января 2011

Обновлено Примечание для потомков: по-видимому, в MSVC 2010 нет типа для 80-битных типов с плавающей запятой, поэтому очевидное решение в коде на C или C ++ в виде

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

НЕ работает, и вы фактически вынуждены напрямую использовать язык ассемблера.

...