Seite 1 von 1

NAsm: "Undefinierte" Nachkommastellen?

Verfasst: 17.07.2011 09:39
von Mok
Hallo.
Ich habe mir gestern mit dem x87-FPU-Befehlssatz mein "eigenes" ASin geschrieben:

Code: Alles auswählen

[section .text]
    global _ASin
    _ASin:
        ENTER   4, 0
        FLD     dword [ebp+8]
        FMUL    st0, st0
        FLD1
        FSUBR
        FSQRT
        FPATAN 
        PUSH    eax
        FISTP   dword [esp]
        POP     eax

        LEAVE
        RET     4
Den Code habe ich mit dem VS2010 Linker zu einer Objektdatei und einer statischen Lib gelinkt.
Folgendes Problem tritt auf, wenn ich eine der Dateien einbinde und die Prozedur importiere:

Code: Alles auswählen

Import "fputest.obj"
  MyASin.f( Value.f ) As "_ASin"
EndImport

Debug ASin( -1 )    ; Ergebnis = -1.5707963267948966
Debug MyASin( -1 )  ; Ergebnis = -1.#IND
Wie kann denn eine Nachkommastelle undefiniert sein?

Und jetzt noch etwas ganz Komisches:
Wenn ich die Lib in einem C++ Programm benutze, ASin aufrufe und per cout/endl ausgebe, wird auch -1.#IND angezeigt ABER: wenn ich in C++ den ASM-Code an die MAsm-Syntax anpasse und inline schreibe, kommt tatsächlich -1.5708 raus. :?
Kann mir das jemand von den Profis erklären?

Danke im Voraus, Mok.

Edit:
Achso -1.#IND heißt einfach undefiniert, ich hab mich schon gefragt woher "-1." kommt... wie auch immer...

Re: NAsm: "Undefinierte" Nachkommastellen?

Verfasst: 17.07.2011 13:17
von Danilo
Der Rückgabewert von Floats wird doch auf dem FPU-Stack erwartet?
Probier mal FISTP durch FIST zu ersetzen.
Wenn das geht, dann kannst Du Dir das kopieren in eax wohl ganz sparen,
oder machst es zusätzlich (manche compiler legen es zusätzlich in eax).

Re: NAsm: "Undefinierte" Nachkommastellen?

Verfasst: 17.07.2011 17:16
von Mok
Danke für deine Antwort Danilo - es funktioniert mit FIST einwandfrei. (Wie oben bereits von dir erklärt funzt es natürlich auch ohne)