global start global heap_start extern kernel_main bits 32 ; base, limit, access, flags %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 MAGIC equ 0xe85250d6 LENGTH equ mb_end - mb_start CHECKSUM equ -(MAGIC + LENGTH) section .multiboot align 8 mb_start: dd MAGIC dd 0 dd LENGTH dd CHECKSUM dw 0 dw 0 dd 8 mb_end: section .bss align 16 stack_end: resb 16384 stack_top: 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 start: cli lgdt [gdt_descriptor] mov eax, cr0 or al, 1 mov cr0, eax jmp 0x08:after_lgdt after_lgdt: mov ax, 0x10 mov ds, ax mov ss, ax mov es, ax mov fs, ax mov gs, ax mov esp, stack_end mov ebp, stack_end sti push ebx call kernel_main cli halt: hlt jmp halt