Использование возвращаемых значений FPU в коде c ++

У меня х86NASM Программа, которая, кажется, работает отлично. У меня проблемы с использованием значений, возвращаемых из него. Это 32-битная Windows, использующая MSVC ++. Я ожидаю, что возвращаемое значение вST0.

Минимальный пример, демонстрирующий проблему с возвращаемыми значениями, можно увидеть в этом C ++ иNASM код сборки:

#include <iostream>
extern "C" float arsinh(float);

int main()
{
    float test = arsinh(5.0);
    printf("%f\n", test);                    
    printf("%f\n", arsinh(5.0));             
    std::cout << test << std::endl;          
    std::cout << arsinh(5.0) << std::endl;   
}

Код сборки:

section .data
value: dq 1.0
section .text
global _arsinh
_arsinh:
    fld dword[esi-8]      ;loads the given value into st0
    ret

Я не могу понять, как использовать возвращаемое значение, поскольку я всегда получаю неправильное значение независимо от того, какой тип данных я использую. В этом примере должно быть возвращено значение 5, и я ожидаю, что результат будет выглядеть так:

5.000000

5.000000

5

5

Вместо этого я получаю вывод, похожий на:

-9671494178951383518019584,000000

-9671494178951383518019584,000000

-9.67149e + 24

5

Только окончательное значение представляется правильным. Что не так с этим кодом? Почему он не всегда возвращает значение с плавающей запятой, которое я ожидаю от своей функции? Как я могу исправить этот код?

Ответы на вопрос(1)

Ваш ответ на вопрос