[BITS 16]
org 0x7c00
%define STACKSEGMENT 0x9000
%define STACKSIZE 0x200
%define KERNELSEGMENT 0x4000
jmp START

GDTR:
limit dw (GDT_END - GDT - 1)
base dd (0)
GDT:

NULL_DESCRIPTOR EQU $-GDT
dd 0
dd 0
CODE_DESCRIPTOR EQU $-GDT
dw 0ffffh
dw 0
db 0
db 09ah
db 0cfh
db 0
DATA_DESCRIPTOR EQU $-GDT
dw 0ffffh
dw 0
db 0
db 092h
db 0cfh
db 0

GDT_END:
START:
cli
mov ax, STACKSEGMENT
mov ss, ax
mov sp, STACKSIZE
xor ax, ax
mov ds, ax
sti
xor bx, bx
mov ax, KERNELSEGMENT
mov es, ax
mov ah, 0x2
mov al, 1
mov ch, 0
mov cl, 2
mov dh, 0
mov dl, 0
int 0x13
cli
mov ax, cs
mov ds, ax
xor eax, eax 
mov es, ax
mov si, GDT
xor di, di
mov cx, 6
rep movsd
lgdt [GDTR]
mov eax, cr0
or eax, 1
mov cr0, eax
db 0xea
dw (PMODE)
dw 0x8
[BITS 32]
PMODE:
xor eax, eax
mov eax, 2
shl eax, 3
mov ds, ax
mov ss, ax
mov es, ax
xor ax, ax
mov fs, ax
mov gs, ax
mov esp, 090000h
jmp 08h:040000h
times 512-($-$$)-2 db 0
dw 0x0AA55