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