N
Hi.
An deinem Code stimmt tatsaechlich was nicht. :p
Ich werde das mal von oben nach unten durchgehen und Optimierungsvorschlaege sowie Fehlerbeschreibungen auflisten:
Erstmal kannst du dir die Codezeilen 10 bis 32 komplett schenken.
Die physikalischen Speicheradressen in deinem Bootblock sind immer die selben, also brauchst du sie nicht jedes mal neu berechnen zu lassen.
Da die Basisadressen vom Code und Datensegment eigentlich schon richtig eingetragen sind (0), reicht es, wenn du einfach og. Codezeilen loeschst.
Lediglich die Daten bei "gdt_desc:" muesstest du dann noch aendern.
Also statt 0, gleich die richtige Groesse der GDT (die ist schliesslich auch bekannt) und die Basisadresse eintragen (das waere hier einfach gdt_desc).
Mal abgesehen davon, dass dieser Code eh ueberfluessig ist, werde ich ihn trotzdem nochmal durchgehen:
Wieso schiebst du in Zeile 14 ebx nach eax? Diese Codekonstruktion macht IMHO keinen Sinn.
Das gleiche eigentlich auch in Zeile 28.
In Zeile 29 haette es dann auch ein "lea ebx, [ebx + gdt]" oder ein einfaches "add ebx, gdt" getan.
In den Zeilen 31/32 liegt dann vermutlich der Fehler, der deinen Code crashen laesst: Du schreibst eax (bekanntlich 32Bit lang) in das nur 16Bit lange "Limit"-Feld von gdtr, und zwar nachdem du dahinter bereits die Basisadresse eingetragen hast. => Die Basisadresse wird auf 0x00000000 zurueckgesetzt.
In den Zeilen 49 bis 52 versuchst du ein 32Bit-Register in 16Bit lange Segmentregister zu stauchen?
Die auskommentierten Zeilen 55/56 wuerden in deinem urspruenglichen Code wohl auch nicht zum Gewuenschten Erebnis fuehren, da dein Datensegment bei der Basisadresse von ds beginnt und nicht bei 0.
Und zum Schluss noch zu den Descriptoren selbst:
Wieso ist dein Datensegment nach unten erweiterbar, wenn es bei 0 anfaengt? Das macht keinen Sinn. Benutze hier besser ein normales Datensegment (Typ 001).
So, ich hoffe, dass ich nichts vergessen habe.