Использование возвращаемых значений 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
Только окончательное значение представляется правильным. Что не так с этим кодом? Почему он не всегда возвращает значение с плавающей запятой, которое я ожидаю от своей функции? Как я могу исправить этот код?