Benutzer:INFNIC/Makro um FS und GS auf 4 GB zu erhöhen

; 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