diff --git a/RealToProtectedExampleOsdever.nasm b/RealToProtectedExampleOsdever.nasm new file mode 100644 index 0000000..1bef686 --- /dev/null +++ b/RealToProtectedExampleOsdever.nasm @@ -0,0 +1,68 @@ +[BITS 16] ; We need 16-bit intructions for Real mode + +[ORG 0x7C00] ; The BIOS loads the boot sector into memory location 0x7C00 + + cli ; Disable interrupts, we want to be alone + + xor ax, ax + mov ds, ax ; Set DS-register to 0 - used by lgdt + + lgdt [gdt_desc] ; Load the GDT descriptor + + mov eax, cr0 ; Copy the contents of CR0 into EAX + or eax, 1 ; Set bit 0 + mov cr0, eax ; Copy the contents of EAX into CR0 + + jmp 08h:clear_pipe ; Jump to code segment, offset clear_pipe + + +[BITS 32] ; We now need 32-bit instructions +clear_pipe: + mov ax, 10h ; Save data segment identifyer + mov ds, ax ; Move a valid data segment into the data segment register + mov ss, ax ; Move a valid data segment into the stack segment register + mov esp, 090000h ; Move the stack pointer to 090000h + + mov byte [ds:0B8000h], 'P' ; Move the ASCII-code of 'P' into first video memory + mov byte [ds:0B8001h], 1Bh ; Assign a color code + +hang: + jmp hang ; Loop, self-jump + + +gdt: ; Address for the GDT + +gdt_null: ; Null Segment + dd 0 + dd 0 + +gdt_code: ; Code segment, read/execute, nonconforming + dw 0FFFFh + dw 0 + db 0 + db 10011010b + db 11001111b + db 0 + +gdt_data: ; Data segment, read/write, expand down + dw 0FFFFh + dw 0 + db 0 + db 10010010b + db 11001111b + db 0 + +gdt_end: ; Used to calculate the size of the GDT + + + +gdt_desc: ; The GDT descriptor + dw gdt_end - gdt - 1 ; Limit (size) + dd gdt ; Address of the GDT + + + + +times 510-($-$$) db 0 ; Fill up the file with zeros + + dw 0AA55h ; Boot sector identifyer