; Makro um FS und GS auf 4 GB zu erhöhen
sw_to_pm macro
- mov ax, cs
- mov cs:rmseg, ax ;sprung adresse berechnen
- and eax, 0ffffh
- shl eax, 4
- mov cs:basis15, ax
- mov ebx, eax
- shr ebx, 16
- mov cs:basis23, bl
- add eax, OFFSET cs:GDT_START ;GDT adresse berechnen
- mov cs:gdt_DADR, eax
- lgdt cs:gdt_adr
- CLI ; intterupts sperren
- mov eax, cr0 ; in den pm wechseln
- or eax, 1
- mov cr0, eax
- db 0eah ; sprung um schlange zu lerren
- dw (offset pm)
- dw 8
gdt_adr label fword
- dw 32
GDT_DADR dd ?
GDT_start label dword
; DUMMY DESKRIPTOR
- dw 0
- dw 0
- db 0
- db 0
- db 0
- db 0
; CS DESKRIPTOR
- dw 0ffffh
basis15 dw ?
basis23 db ?
- db 09ah
- db 00h
- db 0
; fs/gs DESHRIPTOR
- dw 0ffffh
- dw 1
- db 1
- db 092h
- db 11001111b
- db 0
pm: mov ax, 10h ; segmentregister fs und gs laden
- mov fs, ax
- mov gs, ax
- mov eax, cr0 ; zurück in den rm
- btr eax, 0
- mov cr0, eax
- db 0eah
- dw (offset rm)
rmseg: dw 0
rm: sti ; interupt wieder erlauben
- endm