[BITS 32] [GLOBAL start] start: mov esp, _sys_stack jmp stublet ALIGN 4 mboot: MULTIBOOT_ALIGN equ 1<<0 MULTIBOOT_MEM equ 1<<1 MULTIBOOT_AOUT equ 1<<16 MULTIBOOT_MAGIC equ 0x1BADB002 MULTIBOOT_FLAGS equ MULTIBOOT_ALIGN | MULTIBOOT_MEM | MULTIBOOT_AOUT MULTIBOOT_CHECKSUM equ -(MULTIBOOT_MAGIC + MULTIBOOT_FLAGS) EXTERN code, bss, end dd MULTIBOOT_MAGIC dd MULTIBOOT_FLAGS dd MULTIBOOT_CHECKSUM dd mboot dd code dd bss dd end dd start stublet: EXTERN kernel_main call kernel_main jmp $ [GLOBAL load_gdt] ; Allows the C code to call gdt_flush(). [EXTERN gp] load_gdt: lgdt [gp] ; Load the new GDT pointer mov ax, 0x10 ; 0x10 is the offset in the GDT to our data segment mov ds, ax ; Load all data segment selectors mov es, ax mov fs, ax mov gs, ax mov ss, ax jmp 0x08:flush ; 0x08 is the offset to our code segment: Far jump! flush: ret %macro ISR 1 global isr%1 isr%1: cli push byte 0 push byte %1 jmp isr_common %endmacro %macro ISR_ERR 1 global isr%1 isr%1: cli push byte %1 jmp isr_common %endmacro %macro IRQ 2 global irq%1 irq%1: cli push byte 0 push byte %2 jmp irq_common %endmacro ISR 0 ISR 1 ISR 2 ISR 3 ISR 4 ISR 5 ISR 6 ISR 7 ISR_ERR 8 ISR 9 ISR_ERR 10 ISR_ERR 11 ISR_ERR 12 ISR_ERR 13 ISR_ERR 14 ISR 15 ISR 16 ISR_ERR 17 ISR 18 ISR 19 ISR 20 ISR 21 ISR 22 ISR 23 ISR 24 ISR 25 ISR 26 ISR 27 ISR 28 ISR 29 ISR_ERR 30 ISR 31 IRQ 0, 32 IRQ 1, 33 IRQ 2, 34 IRQ 3, 35 IRQ 4, 36 IRQ 5, 37 IRQ 6, 38 IRQ 7, 39 IRQ 8, 40 IRQ 9, 41 IRQ 10, 42 IRQ 11, 43 IRQ 12, 44 IRQ 13, 45 IRQ 14, 46 IRQ 15, 47 extern fault_handler isr_common: pusha push ds push es push fs push gs mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov eax, esp push eax mov eax, fault_handler call eax pop eax pop gs pop fs pop es pop ds popa add esp, 8 iret extern irq_handler irq_common: pusha push ds push es push fs push gs mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov eax, esp push eax mov eax, irq_handler call eax pop eax pop gs pop fs pop es pop ds popa add esp, 8 iret [GLOBAL idt_load] idt_load: mov eax, [esp+4] lidt [eax] ret SECTION .bss resb 8192 _sys_stack: