;BIG UN/REAL MODE DYNAMIC GDT ; 42 bytes NASM syntax olivier.poudade.free.fr 2010 mov byte [6000h],10h ; gdt descriptor gdt size nb:00*=base a00-a15,base a16-a23,segment access rights,limit 19:16+flags,base a24-a31 mov word [6002h],6006h ; gdt descriptor gdt address mov word [600eh],0ffffh; gdt descriptor segment limit mov word [6013h],0cf92h; gdt descriptor cf=present,ring 0 DPL,data,expand-up,writable 92h=32-bit page-granularity lgdt [6000h] ; load gdt table mov eax,cr0 ; switch to pmode xormode:xor al,1 ; 1st=>set pmode bit LSbit=1(or al,1;switch to protected mode) mov cr0,eax ; set control register 0 LSb push word 8 ; select descriptor 1 aka NULL descriptor entry 0 of Descriptor Table pop ds ; 8h = 1000b jp xormode ; PF=1=>set pmode bit LSbit=0(and al,0feh;back to real mode) mov ds,bp ; pop ds/restore big real mode @here bp=0 (from MBR entry register status) now DS can access 4gb mov bx, 0x0f01 ; excluded from footprint / attrib+character mov word [0x0b8000],bx ; excluded from footprint / 32-bit offset with default DS descriptor