; Sample from "Setting Up Long Mode" ; (http://wiki.osdev.org/Setting_Up_Long_Mode) bits 32 ; Entering Long Mode mov ecx, 0xc0000080 ; EFER MSR rdmsr or eax, 0x00000100 ; set LM wrmsr ; Switch to Protected Mode without Paging mov eax, cr0 and eax, 0x7fffffff ; clear PG or eax, 0x00000001 ; set PM mov cr0, eax ; enter 64bit Mode lgdt [GDT64.Pointer] jmp GDT64.Code:Realm64 bits 64 Realm64: cli ; Clear the interrupt flag. mov ax, GDT64.Data ; Set the A-register to the data descriptor. mov ds, ax ; Set the data segment to the A-register. mov es, ax ; Set the extra segment to the A-register. mov fs, ax ; Set the F-segment to the A-register. mov gs, ax ; Set the G-segment to the A-register. mov edi, 0xB8000 ; Set the destination index to 0xB8000. mov rax, 0x1F201F201F201F20 ; Set the A-register to 0x1F201F201F201F20. mov ecx, 500 ; Set the C-register to 500. rep movsq ; Clear the screen. hlt ; Halt the processor. Die: jmp Die ; GDT64: ; Global Descriptor Table (64-bit). .Null equ $ - GDT64 ; The null descriptor. dw 0 ; Limit (low). dw 0 ; Base (low). db 0 ; Base (middle) db 0 ; Access. db 0 ; Granularity. db 0 ; Base (high). .Code equ $ - GDT64 ; The code descriptor. dw 0 ; Limit (low). dw 0 ; Base (low). db 0 ; Base (middle) db 10011000b ; Access. db 00100000b ; Granularity. db 0 ; Base (high). .Data equ $ - GDT64 ; The data descriptor. dw 0 ; Limit (low). dw 0 ; Base (low). db 0 ; Base (middle) db 10010000b ; Access. db 00000000b ; Granularity. db 0 ; Base (high). .Pointer: ; The GDT-pointer. dw $ - GDT64 - 1 ; Limit. dq GDT64 ; Base.