FPU reagiert nicht



  • muss man den FPU erst irgendwie aktivieren?
    ich benutz ganz normal FPU Befehle, habe auch davor das Command-Register richtig gesetzt,
    aber das Teil macht einfach nichts,
    mein Programm stürzt zwar nicht ab, aber der FPU ignoriert alle Befehle einfach

    jemand ne Idee was ich falsch mach?



  • scales of justice schrieb:

    muss man den FPU erst irgendwie aktivieren?
    ich benutz ganz normal FPU Befehle, habe auch davor das Command-Register richtig gesetzt,
    aber das Teil macht einfach nichts,
    mein Programm stürzt zwar nicht ab, aber der FPU ignoriert alle Befehle einfach

    jemand ne Idee was ich falsch mach?

    Gib mal code.



  • *tipp*: finit ausgefuehrt?



  • mit Command-Register richtig gesetzt meinte ich finit ausgeführt,
    aber jetzt wo du es sagst merk ich dass ichs doch vergessen hab -.-

    naja, trotzdem funktioniert das Programm nicht, mein Pc bleibt einfach hängen, oder springt an völlig wirre Speicheradressen

    hier mal der Code, soll eine Funktion sein, die in C eingebunden wird
    und eine float Variable in eine long Variable umwandeln soll,
    der Code ist für nasm:

    _convert:
    push bp
    mov bp, sp
    ffree st0 ;FPU Register als leer markieren
    ffree st1
    ffree st2
    ffree st3
    ffree st4
    ffree st5
    ffree st6
    ffree st7
    finit             ;Command-Register richtig initalisieren
    fld dword [bp+6]  ;Fließkommazahl in st0 laden
    fist dword [bp+6] ;als Integer wieder aus st0 laden
    mov ax, [bp+6]    ;niederen Teil in ax
    mov dx, [bp+4]    ;höhren Teil in dx zurückgeben (C-Calling-Convention)
    mov sp, bp
    pop bp
    ret
    


  • Erstmal denke ich, dass die ganzen ffrees ueberfluessig sind.
    Warum popst du den Wert uebrigens nicht gleich mit fistp wieder runter? Brauchst du den spaeter noch?
    Hat es einen besonderen Grund, dass du am Ende des Codes bp nach sp packst?
    Der hoehere Wert des Ergebnisses liegt uebrigens in bp + 8.

    Ansonsten kann ich so keinen Fehler entdecken. Schau mal mit einem Disassembler auf den fertigen Code... Ich vermute, dass du mit dem fist irgendwo den Stack zermurxt hast.



  • Erstmal denke ich, dass die ganzen ffrees ueberfluessig sind

    glaub ich auch, aber ich dachte ich mach die zur Sicherheit mal hin, funktionieren müsste es auch so

    Warum popst du den Wert uebrigens nicht gleich mit fistp wieder runter?

    könnte man machen, aber da ich die Register eh mit ffree leere kann man es genausogut bleiben lassen

    Hat es einen besonderen Grund, dass du am Ende des Codes bp nach sp packst?

    mach ich immer zur Sicherheit, damit ich nicht doch irgendwo etwas nicht runtergepoppt habe
    um Geschwindigkeit gehts mir noch nicht, die kommt dran wenn alles läuft

    Der hoehere Wert des Ergebnisses liegt uebrigens in bp + 8

    ne, das ist 16-Bit, genauso wie der C-Code

    Schau mal mit einem Disassembler auf den fertigen Code... Ich vermute, dass du mit dem fist irgendwo den Stack zermurxt hast

    ich seh doch nicht was fist macht, wenn ich den Code dissassembliere, oder wird fist in viele kleine Codes zerlegt?
    irgendwie nicht oder?



  • scales of justice schrieb:

    Der hoehere Wert des Ergebnisses liegt uebrigens in bp + 8

    ne, das ist 16-Bit, genauso wie der C-Code

    Irgendwie habe ich Schwierigkeiten, den Zusammenhang zwischen meinem Hinweis und deiner Antwort darauf richtig zu erkennen. Erklaer das doch bitte nochmal genauer.

    scales of justice schrieb:

    Schau mal mit einem Disassembler auf den fertigen Code... Ich vermute, dass du mit dem fist irgendwo den Stack zermurxt hast

    ich seh doch nicht was fist macht, wenn ich den Code dissassembliere, oder wird fist in viele kleine Codes zerlegt?
    irgendwie nicht oder?

    Nein, fist ist ein OpCode, und um zu erfassen, was genau fist bewirkt, reicht es hier nicht, nur deinen Codeschnippsel zu betrachten. Mein Gedanke war auch nicht, dass du dir anschaust, wie huebsch der Disassembler deinen Code umformatieren kann, sondern eher, dass du dir mit Hilfe des Codes genau überlegst, was vor/nach dem Aufruf deiner Funktion auf dem Stack passiert. Um tatsaechlich zu sehen, was passiert, brauchst du einen Debugger. Wenn du einen hast und damit umzugehen weisst, ist das sicher zur Fehlersuche komfortabler.



  • Irgendwie habe ich Schwierigkeiten, den Zusammenhang zwischen meinem Hinweis und deiner Antwort darauf richtig zu erkennen. Erklaer das doch bitte nochmal genauer.

    der Wert den ich zurückbekomme ist eine long-Variable, also 4 Byte breit
    in 32-Bit könnte man ja diese 4 Byte komplett in eax laden und an den C-code zurückgeben
    in 16-Bit muss ich aber den unteren Teil in ax und den oberen in dx übergeben
    das heist wenn die Variable an bp+4 anfängt
    kommt bp+4 und und bp+5 in ax, mehr passt auch nicht
    und bp+6 mit bp+7 in dx
    nur bei 32-Bit Code bräuchte ich dx gar nicht und müsste gar nicht erst überlegen wo der obere Teil ist

    einen Debugger hab ich natürlich, auch schon benutzt
    aber der kommt genau auf das Gleiche Ergebnis

    leider konnte der mir auch nicht weiterhelfen, weil ich nicht weis wie es dazu kommt



  • scales of justice schrieb:

    Irgendwie habe ich Schwierigkeiten, den Zusammenhang zwischen meinem Hinweis und deiner Antwort darauf richtig zu erkennen. Erklaer das doch bitte nochmal genauer.

    der Wert den ich zurückbekomme ist eine long-Variable, also 4 Byte breit
    in 32-Bit könnte man ja diese 4 Byte komplett in eax laden und an den C-code zurückgeben
    in 16-Bit muss ich aber den unteren Teil in ax und den oberen in dx übergeben
    das heist wenn die Variable an bp+4 anfängt
    kommt bp+4 und und bp+5 in ax, mehr passt auch nicht
    und bp+6 mit bp+7 in dx
    nur bei 32-Bit Code bräuchte ich dx gar nicht und müsste gar nicht erst überlegen wo der obere Teil ist

    Danke, offenbar hattest du mich falsch verstanden.
    Hier schreibst du, dass die Variable bei bp+4 liegt. In deinem Code liest du sie aber mit fld von bp+6 und packst sie mit fist anschliessend auch wieder nach bp+6. So wie es im Moment in deinem Code steht, faengt die Variable also bei bp + 6 an. Dh. der Teil, der nach ax gehoert, liegt bei bp + 6 und bp + 7 (das haeltst du in deinem Code auch konsequent durch). Der hoehere Teil, der nach dx gehoert, liegt folglich jedoch nicht bei bp + 4, so wie es in deinem Schnippsel steht, sondern bei bp + 8 und bp + 9. Genau das habe ich versucht, dir begreiflich zu machen. Hoffe, es war diesmal verstaendlich...

    Da du ein einfaches ret verwendest, scheint die Ruecksprungadresse nur 16Bit gross zu sein. Ich vermute also, dass der Stack in deiner Funktion von bp aus betrachtet wie folgt aussieht:
    bp + 0: bp
    bp + 2: ret
    bp + 4: Parameter 1 (untere 16bit)
    bp + 6: Parameter 1 (obere 16bit)

    Sollte das zutreffen, liest und schreibst du mit deinem Code in der falschen Adresse im Stack. Die dwords muessen mit bp+4 adressiert werden.

    scales of justice schrieb:

    einen Debugger hab ich natürlich, auch schon benutzt
    aber der kommt genau auf das Gleiche Ergebnis

    leider konnte der mir auch nicht weiterhelfen, weil ich nicht weis wie es dazu kommt

    ...und wenn du es nichtmal fuer erwaehnenswert haeltst, was genau dieses "Ergebnis" nun war und an welcher Stelle dein Code aussteigt, kann dir hier auch niemand effektiv weiterhelfen.



  • ah danke du hast recht, das wird der Fehler sein, werd ich nachher mal ausprobieren

    und wenn du es nichtmal fuer erwaehnenswert haeltst, was genau dieses "Ergebnis" nun war und an welcher Stelle dein Code aussteigt, kann dir hier auch niemand effektiv weiterhelfen
    

    das Problem an der Sache ist, dass das ganze ein Betriebssystem ist und das Ding das ich als Debugger bezeichnet hab ist ein Emulator (Bochs),
    leider kann ich das ding noch nicht gut bedienen, deswegen seh ich dann zwar, dass das ding Müll zusammen springt,
    aber nicht wirklich wo das Ganze angefangen hat


Anmelden zum Antworten