Was mache ich falsch?



  • Ich progge grad an einem kleinen Bootloader, der einen Kernel aus dem zweiten Sektor einer Floppy ließt, ihn in den zweiten sektor des rams schreibt und ihn außführt. Der loader startet schon, er ließt auch den zweiten floppysektor aus und schreibt ihn ins am (obs wirklich der 2. sektor is kann ich natürlich nich überprüfen), versucht zum zweiten Ramsektor zu springen und bleb hängenIch poste hier nur den wichtigen Teil des Codes. Die Außgangslage ist, dass ein 80386+ vorhanden ist:

    .386 ;damit far jumps funzen
    
    mov ah, 0                       ; reset drive Funktion
    int 0x13                        ;bios disk i/o
    ;hier wird dann noch überprüft ob der reset erfolgreich war hab ich mal rausgenommen damit man besser durchblickt
    
    ;jetzt wird der sektor 2 von floppy auf sektor 2 ram kopiert
    mov ax, 0x200 
    mov es, ax                      ;Zielsegment
    mov bx, 0                       ; Zieloffset
    mov al, 1                       ; 1 Sektor soll kopiert weren
    mov cl, 2                       ; ab dem 2. Sektor
    mov ch, 0                       ; cylinder 0
    mov dl, [bootdrv]               ; drive number
    
    mov ah, 0x02                    ; read sectors Funktion
    int 0x13                        ; call bios disk i/o
    ;das wird solange wiederholt bisses funzt. Hab ich auchmal rausgenommen
    jmp 0x2000:0x0000 ; Zum kernel springen
    

    Hat irgendwer einen Tipp? is jmp 0x2000:0x0000 so in ordnung oder liegt da irgendwo der fehler?



  • mwoidt schrieb:

    ...in den zweiten sektor des rams...

    Der RAM im RealMode hat Segmente und keine Sektoren.
    Im Gegensatz zu einer Festplatte oder Diskette ist das Ding schließlich nicht kreisförmig.
    Übrigens ist die Definition eines Segments offensichtlich eine andere, als die deines RAM-Sektors. 🤡 (0x0200:0x0000 => 2. Sektor 😕 )

    mwoidt schrieb:

    Hat irgendwer einen Tipp? is jmp 0x2000:0x0000 so in ordnung oder liegt da irgendwo der fehler?

    Ja, ich hab' 'nen Tipp: Der Fehler liegt entweder bei der für den int 0x13 angegebenen Zieladresse oder beim FAR-Jump.
    Die beiden Adressen sollten schon übereinstimmen, wenn tatsächlich der code gestartet werden soll, der von Diskette eingelesen wurde. 😉



  • Sagst du mir auch noch zu welcher Adresse ich springen muss, wenn ich die bei int 0x13 so lasse?



  • Ist 0x12:0x00 richtig?



  • Hi.

    Schau dir doch mal an, wo du den Code von der Diskette hinlaedst. 🙄

    mov ax, 0x200  
    mov es, ax                      ;Zielsegment 
    mov bx, 0                       ; Zieloffset
    

    => 0x0200(Segment):0x0000(Offset)
    Und genau dorthin sollte auch der jump fuehren.

    BTW: Bei deinem code sehe ich nicht, wo dh (head nr.) gesetzt wird.
    Beim Diskettenlaufwerk kanns 0 und 1 sein.



  • Oh tschuldigung ja. Da hab ich mich wohl verrechnet. Danke für deine bemühungen


Anmelden zum Antworten