Hi,
Was soll das hier machen?
mov eax, cs ; Daten-, Stack und Extrasegment mit Datensegmentdesktriptor laden
shl eax, 4
add eax, gdt
mov ds, ax
mov ss, ax
mov es, ax
mov eax, 0 ; FS und GS mit Null-Deskriptor laden
mov fs, ax
mov gs, ax
Du musst einfach DS, ES,FS, GS, SS mit 0x10 und CS mit 0x8 laden. Wobei CS schwieriger ist, da du dafür einen Jump durchfürhen musst. So in etwa
mov ax,0x10
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
jmp 0x8:.newcs
.newcs:
ret
Außerdem fehlt das ret in load_gdt und er versucht deine GDT auszuführen.
BTW: GDT (IDT usw auch) kannst du auch von deinem C-Teil aus laden (was einfacher sein könnte). Grub lädt ja beim Start auch eine GDT, die du für den Anfang benutzen kannst. Man sollte trotzdem nachher eine eigene laden, da nicht feststeht welchen Index Code- und Daten-Segment haben.