global load_gdt %macro gdt_entry 4 db %2 & 0xff db (%2 >> 8) & 0xff db %1 & 0xff db (%1 >> 8) & 0xff db (%1 >> 16) & 0xff db %3 db ((%2 >> 16) & 0x0f) | (%4 << 4) db (%1 >> 24) & 0xff %endmacro section .rodata align 16 gdt_start: gdt_entry 0, 0, 0, 0 gdt_entry 0, 0xFFFFF, 0x9A, 0xC gdt_entry 0, 0xFFFFF, 0x92, 0xC gdt_end: gdt_descriptor: dw gdt_end - gdt_start - 1 dd gdt_start section .text align 8 load_gdt: cli lgdt [gdt_descriptor] mov eax, cr0 or al, 1 mov cr0, eax mov ax, 0x10 mov ds, ax mov ss, ax mov es, ax mov fs, ax mov gs, ax jmp 0x08:after_gdt after_gdt: ret