From a6750cb2a599ef1f0fdacebfbb744a0df8f30e90 Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Thu, 23 Nov 2017 23:25:07 +0100 Subject: [PATCH] Go into 32bits protected mode --- mbr.asm | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/mbr.asm b/mbr.asm index 5a47387..2060fae 100644 --- a/mbr.asm +++ b/mbr.asm @@ -70,5 +70,75 @@ boot: call println add sp, 2 +; Switch in 32bits Protected mode + + ; Activate A20 http://wiki.osdev.org/A20_Line to be able to access more than 1Mb memory + mov ah, 0h + mov ax, 0x2401 + int 0x15 + + ; Change video mode to display VGA + mov ax, 0x3 + int 0x10 + + + cli ; clear interruption flag + + ; switch in 32 bits + lgdt [gdt_pointer] ; switch in 32bits here + mov eax, cr0 + or eax,0x1; set the protected mode bit on special CPU reg cr0 + mov cr0, eax + jmp CODE_SEG:boot2 + +; GDT table desciption could be found http://wiki.osdev.org/Global_Descriptor_Table +; here we define the 3 64bits segment needed: null segment, code segment and data segment +gdt_start: ;null segment + dq 0x0 +gdt_code: ;code segment + dw 0xFFFF + dw 0x0 + db 0x0 + db 10011010b + db 11001111b + db 0x0 +gdt_data: + dw 0xFFFF + dw 0x0 + db 0x0 + db 10010010b + db 11001111b + db 0x0 +gdt_end: +gdt_pointer: + dw gdt_end - gdt_start + dd gdt_start + +CODE_SEG equ gdt_code - gdt_start +DATA_SEG equ gdt_data - gdt_start + +bits 32 +boot2: + mov ax, DATA_SEG + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov esi,hello32 + mov ebx,0xb8000 ; Cannot use BIOS anymore, use VGA Text buffer instead + +.loop32: + lodsb + or al,al + jz halt + or eax,0x0100 ; blue bg + mov word [ebx], ax + add ebx,2 + jmp .loop32 +halt: + cli + hlt +hello32: db "Hello world!",0 times 510 - ($ - $$) db 0 ; fill up to 510 with 0 dw 0xAA55 ; MBR magic number