Problem beim Kopieren eines Datenblocks
-
Hallo!
Ich will meine GDT an einen anderen Platz verschieben, dies sollte ja eigentlich nicht so schwer sein - naja aber irgendwie funktioniert es nicht, hier mein Code:mov ax, 0x86C0 mov es, ax xor di, di ;nach 86C0:0000 - dort fängt unsere GDT an mov ax, 0x07C00 ;von da wo wir grad sind ;) add ax, des_null mov gs, ax mov fs, ax mov cx, 28h ;Anzahl der Deskriptoren copygdt: mov ax, word[gs:di] mov [es:di], ax inc di loop copygdt ;selbst erklärend mov eax, es mov [global_table+GDTSTRUCT.base], eax lgdt [global_table]
Also ich finde absolut keinen Fehler!
Mit stosb hab ichs auch schonmal versucht, ging genau so wenigKevin
-
Hi.
Du setzt die Segmentregister gs und fs falsch.
fs:0000
wuerde deinem code zufolge auf 7C00+16*des_null:0000 zeigen.
Da aber dein Bootstrap schonmal nicht nach 7C00:0000 sondern nach 07C0:0000 oder 0000:7C00 kopiert wird, kann da was nicht stimmenAlso 1. nicht das Offset von des_null auf die Segmentregister addieren, sondern selbige einfach der "Org"-Anweisung am Anfang deines Codes entsprechend setzen.
2. 2 verschiedene Indexregister verwenden, wovon der, der zum lesen der gdt verwendet wird das Offset von des_null beinhalten sollte...
3. *argh* zum verschieben eines bytes braucht man keine 16Bit-Register!
-
HI Danke!
Aber normalerweise müsste doch dann das hier gehen, tuts aber nicht:mov ax, 0x0000 mov ds, ax mov ax, 0x7c00 ;=> DS:SI = 0000:7C00 mov si, ax mov ax, 0x86C0 mov es, ax ;=> ES:DI = 86C0:0000 xor di, di mov cx, 40h rep movsb mov eax, 0x86C00 mov [global_table+GDTSTRUCT.base], eax lgdt [global_table]
Wenn ich das nun so ausführ sagt mir Bochs:
00000569943p[CPU ] >>PANIC<< jump_protected: JUMP to busy 286 TSS unsupported.also scheint die GDT wieder nicht richtig kopiert zu sein, denn wenn ich sie normal aus meiner Anwendung ohne zu verschieben verwende funktioniert alles :((
Kevin
-
Oh ich depp hab vergessen des_null noch dazuzu addieren - mein gott bin ich blöd
Ich dank dir trotzdem!
Meine dummen Anfängerfehler *wein*
Kevin