Verwenden von FPU-Rückgabewerten in C ++ - Code

Ich habe eine x86 NASM Programm, das perfekt zu funktionieren scheint. Ich habe Probleme bei der Verwendung der zurückgegebenen Werte. Dies ist 32-Bit-Windows mit MSVC ++. Ich erwarte den Rückgabewert in ST0.

in minimales Beispiel, das das Problem mit den zurückgegebenen Werten demonstriert, ist in diesem C ++ und @ zu sehe NASM Assembler-Code:

#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;   
}

Assembly code:

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

Ich kann jedoch nicht herausfinden, wie der Rückgabewert verwendet wird, da ich immer den falschen Wert erhalte, egal welchen Datentyp ich verwende. In diesem Beispiel sollte der Wert 5 zurückgegeben werden und ich würde eine Ausgabe erwarten wie:

5.000000

5.000000

5

5

Stattdessen erhalte ich eine Ausgabe ähnlich der folgenden:

-9671494178951383518019584.000000

-9671494178951383518019584.000000

-9.67149e + 24

5

Nur der Endwert scheint korrekt zu sein. Was ist los mit diesem Code? Warum gibt es nicht immer den Gleitkommawert zurück, den ich von meiner Funktion erwarte? Wie kann ich diesen Code reparieren?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage