New Folder/4GB.C

#include #include void Set4gb(); void openA20(); void main() { unsigned long addr; openA20(); Set4gb(); asm push ds asm mov ax,0 asm mov ds,ax asm mov esi,00100000h N1: asm mov eax,[esi] asm mov dword ptr[esi],0 asm mov ebx,[esi] asm mov dword ptr[esi],0ffffffffh asm mov ecx,[esi] asm mov [esi],eax asm inc ecx asm cmp ebx,ecx asm jne N2 asm add esi,4 asm jmp N1 N2: asm mov addr,esi asm pop ds printf("RAM=%1d(Mb)",addr>>20); } void openA20() { while(inp(0x64)&2); outp(0x64,0xd1); while(inp(0x64)&2); outp(0x60,0xdf); while(inp(0x64)&2); outp(0x64,0xff); } void Set4gb() { asm cli asm push ds asm push es asm mov dword ptr GDT_Addr[0],(2*8-1) asm mov eax,ds asm shl eax,4 asm xor ebx,ebx asm mov bx,offset GDT_def asm add eax,ebx asm mov dword ptr GDT_Addr[2],eax asm lgdt fword ptr GDT_Addr asm mov bx,8 asm mov eax,cr0 asm or al,1 asm mov cr0,eax asm jmp flush1 flush1: asm mov ds,bx asm mov es,bx asm and al,0feh asm mov cr0,eax asm jmp flush2 flush2: asm pop es asm pop ds asm sti }