// vim: et:sw=12:ts=12:sts=12 .global _start .text .code16 _start: cli cld mov %cs, %ax mov %ax, %ds mov $message, %si call print call enable_a20 lea message, %si call print lgdt gdt_ptr call enter_prot 1: hlt jmp 1b enable_a20: // TODO more thorough implementation inb $0x92, %al or $2, %al outb %al, $0x92 ret enter_prot: mov %cr0, %eax or $1, %al mov %eax, %cr0 ret print: xor %bx, %bx 1: lodsb or %al, %al jz 2f mov $0x0E, %ah int $0x10 jmp 1b 2: ret gdt: // entry 0: null descriptor .word 0 .word 0 .byte 0 .byte 0 .byte 0 .byte 0 // entry 1: code segment .word 0xFFFF .word 0 .byte 0 .byte 0b10011010 .byte 0x8F .byte 0 // entry 2: data segment .word 0xFFFF .word 0 .byte 0 .byte 0b10010010 .byte 0x8F .byte 0 .set gdt_size, .-gdt gdt_ptr: .word gdt_size-1 .long gdt message: .asciz "Hello, World!\r\n"