Code: Select all
[BITS 16]
[ORG 0x00]
jmp start
start:
cli
mov ax,cs
mov ds,ax
mov es,ax
mov gs,ax
mov fs,ax
mov ss,ax
mov sp,0xffff
sti
lgdt [gdtr] ; Load GDT
mov eax,cr0 ; The lsb of cr0 is the protected mode bit
or al,0x01 ; Set protected mode bit
mov cr0,eax ; Mov modified word to the control register
mov ax,datasel
mov ds,ax ; Initialise ds & es to data segment
mov es,ax
mov ss,ax
mov fs,ax
mov ax,videosel ; Initialise gs to video memory
mov gs,ax
jmp codesel:go_pm
bits 32
go_pm:
mov BYTE [gs:0x00],'P'
mov BYTE [gs:0x01],0x3f
jmp $
;-------------------------------------------------------------------------------------------;
; GDT ;
;-------------------------------------------------------------------------------------------;
gdtr:
dw gdt_end-gdt-1 ; Length of the gdt
dd gdt ; physical address of gdt
gdt:
nullsel equ $-gdt ; $->current location,so nullsel = 0h
gdt0: ; Null descriptor,as per convention gdt0 is 0
dd 0 ; Each gdt entry is 8 bytes, so at 08h it is CS
dd 0
; In all the segment descriptor is 64 bits
codesel equ $-gdt ; This is 8h,ie 2nd descriptor in gdt.Code descriptor 4Gb flat segment at 0000:0000h
dw 0xffff ; Limit 4Gb bits 0-15 of segment descriptor
dw 0x0000 ; Base 0h bits 16-31 of segment descriptor (sd)
db 0x00 ; Base addr of seg 16-23 of 32bit addr,32-39 of sd
db 0x09a ; P,DPL(2),S,TYPE(3),A->Present bit 1,Descriptor
; privilege level 0-3,Segment descriptor 1 ie code
; or data seg descriptor,Type of seg,Accessed bit
db 0x0cf ; Upper 4 bits G,D,0,AVL ->1 segment len is page
; granular, 1 default operation size is 32bit seg
; AVL : Available field for user or OS
; Lower nibble bits 16-19 of segment limit
db 0x00 ; Base addr of seg 24-31 of 32bit addr,56-63 of sd
datasel equ $-gdt ; ie 10h, beginning of next 8 bytes for data sd.Data descriptor 4Gb flat seg at 0000:0000h
dw 0x0ffff ; Limit 4Gb
dw 0x0000 ; Base 0000:0000h
db 0x00 ; Descriptor format same as above
db 0x092
db 0x0cf
db 0x00
videosel equ $-gdt ; ie 18h,next gdt entry
dw 3999 ; Limit 80*25*2-1
dw 0x8000 ; Base 0xb8000
db 0x0b
db 0x92 ; present,ring 0,data,expand-up,writable
db 0x00 ; byte granularity 16 bit
db 0x00
gdt_end