BITS 32 extern main extern init_entry extern kernel_cx extern cur_cx extern init %macro pop_regs 0 pop ds pop es pop fs pop gs popa %endmacro SECTION .text STACK_SIZE equ 0x100000 %define VGA 0x0B8000 ; GNU Multiboot header %define MAGIC 0x1BADB002 %define FLAGS 0x00000001 dd MAGIC ; magic dd FLAGS ; flags dd - (MAGIC + FLAGS) ; checksum dd 0 ; header_addr dd 0 ; load_addr dd 0 ; load_end_addr dd 0 ; bss_end_addr dd 0 ; entry_addr dd 0 ; mode_type dd 0 ; mode_width dd 0 ; mode_height dd 0 ; mode_depth ; header length 12 * 4 = 48 bytes ; kernel entry point message db "Hello, world, says entry.s! ", 0 global start start: ; entry point from bootloader mov [multiboot_magic], eax ; store stuff from bootloader mov [multiboot_info], ebx lgdt [gdt_descriptor] ; load GDT jmp 0x08:.jumphere ; long jump; sets cs .jumphere ; set up proper data segment descriptors mov eax, 0x10 mov ds, eax mov es, eax mov fs, eax mov gs, eax mov ss, eax mov eax, message ; write a message to the screen... mov ebx, VGA wstring: mov cl, [eax] mov [ebx], cl add eax, 1 add ebx, 2 cmp byte [eax], 0 jnz wstring mov esp, kernel_stack_top ; set up kernel stack call main ; call C routine to init ; store kernel stack pointer mov [kernel_cx], esp ; init stack mov eax, [cur_cx] mov esp, [eax] pop_regs ; transfer control to init process ; (as if we were returning from an isr) sti iret SECTION .data align 8 gdt: ; null descriptor dw 0x0000 ; limit dw 0x0000 ; base addr bytes 0-1 db 0x00 ; base addr byte 2 db 0x00 ; type db 11000000b ; flags/limit high nibble db 0x00 ; base addr byte 3 ; kernel code segment dw 0xFFFF ; limit dw 0x0000 ; base addr bytes 0-1 db 0x00 ; base addr byte 2 db 10011010b ; type db 11001111b ; flags/limit high nibble db 0x00 ; base addr byte 3 ; kernel data segment dw 0xFFFF ; limit dw 0x0000 ; base addr bytes 0-1 db 0x00 ; base addr byte 2 db 10010010b ; type db 11001111b ; flags/limit high nibble db 0x00 ; base addr byte 3 ; userland code segment dw 0xFFFF ; limit dw 0x0000 ; base addr bytes 0-1 db 0x00 ; base addr byte 2 db 11111010b ; type db 11001111b ; flags/limit high nibble db 0x00 ; base addr byte 3 ; userland data segment dw 0xFFFF ; limit dw 0x0000 ; base addr bytes 0-1 db 0x00 ; base addr byte 2 db 11110010b ; type db 11001111b ; flags/limit high nibble db 0x00 ; base addr byte 3 gdt_end: gdt_descriptor: dw (gdt_end - gdt - 1) ; nsegments dd gdt ; GDT address global multiboot_info multiboot_info dd 0 global multiboot_magic multiboot_magic dd 0 SECTION .bss resb STACK_SIZE kernel_stack_top: