; Declare constants for the multiboot header. MBALIGN equ 1 << 0 ; align loaded modules on page boundaries MEMINFO equ 1 << 1 ; provide memory map FLAGS equ MBALIGN | MEMINFO ; this is the Multiboot 'flag' field MAGIC equ 0x1BADB002 ; 'magic number' lets bootloader find the header CHECKSUM equ -(MAGIC + FLAGS) ; checksum of above, to prove we are multiboot section .multiboot align 4 dd MAGIC dd FLAGS dd CHECKSUM section .bss align 16 stack_bottom: resb 16384 ; 16 KiB stack_top: section .text global reloadSegments ; Flush GDT reloadSegments: JMP 0x08:reload_CS ; 0x08 points at the new code selector reload_CS: MOV AX, 0x10 ; 0x10 points at the new data selector MOV DS, AX MOV ES, AX MOV FS, AX MOV GS, AX MOV SS, AX RET %macro ISR_NOERRCODE 1 ; define a macro, taking one parameter [GLOBAL isr%1] ; %1 accesses the first parameter. isr%1: cli push byte %1 push byte %1 jmp isr_common_stub %endmacro %macro ISR_ERRCODE 1 [GLOBAL isr%1] isr%1: cli push byte %1 jmp isr_common_stub %endmacro ISR_NOERRCODE 0 ISR_NOERRCODE 1 ISR_NOERRCODE 2 ISR_NOERRCODE 3 ISR_NOERRCODE 4 ISR_NOERRCODE 5 ISR_NOERRCODE 6 ISR_NOERRCODE 7 ISR_NOERRCODE 8 ISR_NOERRCODE 9 ISR_NOERRCODE 10 ISR_NOERRCODE 11 ISR_NOERRCODE 12 ISR_NOERRCODE 13 ISR_NOERRCODE 14 ISR_NOERRCODE 15 ISR_NOERRCODE 16 ISR_NOERRCODE 17 ISR_NOERRCODE 18 ISR_NOERRCODE 19 ISR_NOERRCODE 20 ISR_NOERRCODE 21 ISR_NOERRCODE 22 ISR_NOERRCODE 23 ISR_NOERRCODE 24 ISR_NOERRCODE 25 ISR_NOERRCODE 26 ISR_NOERRCODE 27 ISR_NOERRCODE 28 ISR_NOERRCODE 29 ISR_NOERRCODE 30 ISR_NOERRCODE 31 [EXTERN isr_handler] isr_common_stub: pusha ; Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax mov ax, ds ; Lower 16-bits of eax = ds. push eax ; save the data segment descriptor mov ax, 0x10 ; load the kernel data segment descriptor mov ds, ax mov es, ax mov fs, ax mov gs, ax call isr_handler pop eax ; reload the original data segment descriptor mov ds, ax mov es, ax mov fs, ax mov gs, ax popa ; Pops edi,esi,ebp... add esp, 8 ; Cleans up the pushed error code and pushed ISR number sti iret ; pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP global _start:function (_start.end - _start) _start: mov esp, stack_top extern kernel_main call kernel_main cli .hang: hlt jmp .hang .end: