Gelöst: nach Rückkehr von externer Datei hängt sich alles auf...
-
Hallo zusammen,
ich habe meinen Floppytreiber soweit das er auch auf echter Hardware
ordnungsgemäß läuft.Dazu habe ich meine Console so erstellt das ich über Eingabe einzelner
Befehle bestimmte Programmfunktionen aufrufen kann.z.B.
$: read [Enter]
führt folgende Prozedur aus
flpread proc pushad call reset invoke Sleep, 50d invoke FLPMOTOR_ON invoke FLPCalibrate invoke Sleep, 50d invoke FLPDriveData, 0Dh, 2d, 0Fh, 0 invoke Sleep, 50d invoke FLPWriteCCR invoke Sleep, 50d invoke FLPReadSektor, dword ptr LOGSEKTOR invoke itoh, eax invoke PrintString, eax crlf ;--------------------------------------------------------------- invoke FLPMOTOR_OFF popad RET flpread endp
Das ganze funktioniert auch tadellos, wie gesagt auch auf meinem richtigem PC
mit Floppylaufwerk.Nun kann ich diese Funktion x-mal aufrufen und sie wird immer korrekt
ausgeführt.Zum Test habe ich mal eine kleine Datei (.com) erstellt mit NASM die nur einen Text
auf dem Schirm mittels Int-Aufrufen bringt und nach dem RET
zum Aufrufer (zurück zur Console) springt.org 0x400000 cpu 486 [Bits 32] start: mov eax, 100d mov ebx, sys int 30h push dword str_test mov ebx, [PrintString] call ebx ret sys: Sleep dd 0 PrintString dd 0 itoh dd 0 GetChar dd 0 GetFreePage dd 0 str_test db "Testausgabe vom neuen Programm: ",0
Diese Programm wird an den Offset sektoradresse geladen der im Programm selbst
definiert ist.
Der folgende Code lädt die kleine Datei aus Sektor 56 an die Adresse 400000h
und springt mittels CALL dorthin.Load proc pushad mov eax, 56d mov LOGSEKTOR, eax ;log. Sektor 56 enthält .com Datei invoke flpread mov esi, offset sektoradresse ;512 Byte nach 400000h kopieren mov edi, 400000h mov ecx, 512d rep movsb mov ebx, 400000h call ebx ;Near Call popad RET Load endp
Das Problem was ich habe ist folgendes:
Nach Ausgabe des Textes und dem RET in Zeile 15 erscheint meine Eingabeaufforderung wieder mit
blinkendem Cursor aber nach einer erneuten Befehlseingabe und drücken der ENTER
Taste hängt sich das Programm ohne Fehlermeldung auf.Segmentregister werden keine verändert, es sollte alles wie beim Aufruf
eines Near-Call laufen.
Die Console sowie die .com Datei laufen in PL0 im 32Bit Protected Mode.Einen Debugger habe ich nur auf Virtual Box, aber dort läuft das ganze
überhaupt nichtIch weiß nicht wo der Fehler ist.
Wie gesagt über meine Console kann ichinvoke flpread
so oft aufrufen wie ich will und alles läuft und der Inhalt der Sektoren
wird mir fehlerfrei angezeigt. Nur der Sprung nach 400000h und das RET
macht irgendwas kaputt.Nicky
PS: falls noch Code gewünscht wird bitte bescheid geben.
**
Habe den Fehler gefunden...
Hatte eine Funktion im Floppymodul inkl. Parameter erstellt, bei der aber kein Parameter übergeben wurde.
Ein Aufruf mit Invoke hätte mir eine Fehlermeldung eingebracht, mit CALL
jedoch nichtWieso dennoch zur Console zurück gesprungen werden konnte weiß ich jedoch nicht.
Schließlich ist das Programm erst beim nächsten Befehl hängen geblieben.
**
-
Hallo.
Ich finde keinen Fehler.
Aber "movsb" kopiert von DS:ESI nach ES:EDI.
Vieleicht ist das wichtig.Sonst braucht der "call" etwas Platz auf dem Stack, um die Rücksprungadresse aufzuehmen. Und ist die Adresse 400000h eigentlich frei?
Dirk
-
Hallo Dirk,
DS, ES, FS und GS sind alle mit 0x10 initialisiert und werden auch nicht umgeladen.
Der Stack ist auch groß genaug..Mein Programm wird nach 0x200000h geladen und ist im Moment nur 12Kb groß.. also
auch hier genug Platz nach oben...Ich weiß halt nicht wo es sich aufhängt, da auch kein IRQ aufgerufen wird.
Werde nochmal etwas versuchen...
Nicky
-
mov eax 100d?