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 nicht 😞

    Ich weiß nicht wo der Fehler ist.
    Wie gesagt über meine Console kann ich

    invoke 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 nicht 🙄

    Wieso 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?


Anmelden zum Antworten