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 einfachjemand 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 einfachjemand 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äuftDer 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 isteinen Debugger hab ich natürlich, auch schon benutzt
aber der kommt genau auf das Gleiche Ergebnisleider 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 istDanke, 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 Ergebnisleider 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