[BITS 32] ALIGN 4 mboot: MULTIBOOT_PAGE_ALIGN equ 1<<0 MULTIBOOT_MEMORY_INFO equ 1<<1 MULTIBOOT_HEADER_MAGIC equ 0x1BADB002 MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) EXTERN code, bss, end ; GRUB Multiboot header, boot signature dd MULTIBOOT_HEADER_MAGIC dd MULTIBOOT_HEADER_FLAGS dd MULTIBOOT_CHECKSUM ; Main entrypoint global start start: mov esp, _sys_stack push ebx cli extern main call main jmp $ ; Global Descriptor Table global gdt_flush extern gp gdt_flush: lgdt [gp] mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax jmp 0x08:flush2 flush2: ret ; Interrupt Descriptor Table global idt_load extern idtp idt_load: lidt [idtp] ret ; Interrupt Service Routines %macro ISR_NOERR 1 global _isr%1 _isr%1: cli push byte 0 push byte %1 jmp isr_common_stub %endmacro %macro ISR_ERR 1 global _isr%1 _isr%1: cli push byte %1 jmp isr_common_stub %endmacro ISR_NOERR 0 ISR_NOERR 1 ISR_NOERR 2 ISR_NOERR 3 ISR_NOERR 4 ISR_NOERR 5 ISR_NOERR 6 ISR_NOERR 7 ISR_ERR 8 ISR_NOERR 9 ISR_ERR 10 ISR_ERR 11 ISR_ERR 12 ISR_ERR 13 ISR_ERR 14 ISR_NOERR 15 ISR_NOERR 16 ISR_NOERR 17 ISR_NOERR 18 ISR_NOERR 19 ISR_NOERR 20 ISR_NOERR 21 ISR_NOERR 22 ISR_NOERR 23 ISR_NOERR 24 ISR_NOERR 25 ISR_NOERR 26 ISR_NOERR 27 ISR_NOERR 28 ISR_NOERR 29 ISR_NOERR 30 ISR_NOERR 31 extern fault_handler isr_common_stub: 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 %macro IRQ_ENTRY 2 global _irq%1 _irq%1: cli push byte 0 push byte %2 jmp irq_common_stub %endmacro IRQ_ENTRY 0, 32 IRQ_ENTRY 1, 33 IRQ_ENTRY 2, 34 IRQ_ENTRY 3, 35 IRQ_ENTRY 4, 36 IRQ_ENTRY 5, 37 IRQ_ENTRY 6, 38 IRQ_ENTRY 7, 39 IRQ_ENTRY 8, 40 IRQ_ENTRY 9, 41 IRQ_ENTRY 10, 42 IRQ_ENTRY 11, 43 IRQ_ENTRY 12, 44 IRQ_ENTRY 13, 45 IRQ_ENTRY 14, 46 IRQ_ENTRY 15, 47 extern irq_handler irq_common_stub: 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 ; BSS Section SECTION .bss resb 8192 ; 8KB of memory reserved _sys_stack: ; This line intentionally left blank