PM_Service: Mov AX,16 Mov _seg,AX Mov EBX,CR0 And EBX,0fffffffeh Mov CR0,EBX DB 0eah DW Real_Service DW seg Real_Service
Real_Service: Lgdt FWORD Ptr [Old_GDTR]
Popfd ;恢复现场 Popad Pop ES Pop DS Jmp _Exit
MyGdt DQ 0 DW -1,0,9a00h,0 DW -1,0,9200h,0cfh DQ 0
Old_GDTR DW 0,0,0 GDTR DW 0,0,0 _Exit: Endm
在这里为了方便我只把FS改成4GB段,读者可以按需要自行决定使用哪个段寄存器。只要将这段代码拷贝到你的程序中,然后在开始的时候调用它,就可以通过该段寄存器直接访问大内存了,爽吧!
最后还有一点一定要注意:如果你的程序运行时有任何扩展内存管理程序存在(HIMEM、EMM386等)都要千万小心,因为很容易会破坏到它们的内部数据或其他程序的数据,如果是这样就只有死机一条路可走了。切记切记!我的建议是最好从内存顶端开始使用扩展内存。这时破坏其他数据的可能要小一些。 local MyGdt,PM_Service,Old_GDTR,GDTR,Real_Service,MyGdt local _Exit Push DS Push ES Pushad Pushfd ;保护现场 Sub EBX,EBX Mov BX,CS Mov DS,BX
Shl EBX,4 Push EBX
Rol EBX,8 Mov BYTE Ptr MyGdt[8+7],BL Mov BL,BYTE Ptr MyGdt[8+5] Ror EBX,8 Mov DWORD Ptr MyGdt[8+2],EBX
Pop EBX lea EBX,[EBX+MyGdt] Mov DWORD Ptr [GDTR+2],EBX Mov WORD Ptr [GDTR],31 ;建立新的GDTR Cli
Sgdt FWORD Ptr [Old_GDTR] ;保存旧的GDTR Lgdt FWORD Ptr [GDTR] ;设置新的GDTR Mov EBX,CR0 Or BL,1 Mov CR0,EBX ;进入保护模式 DB 0eah DW PM_Service DW 8 ;跳转到保护模式代码执行| PM_Service: Mov AX,16 Mov _seg,AX Mov EBX,CR0 And EBX,0fffffffeh Mov CR0,EBX DB 0eah DW Real_Service DW seg Real_Service
Real_Service: Lgdt FWORD Ptr [Old_GDTR]
Popfd ;恢复现场 Popad Pop ES Pop DS Jmp _Exit
MyGdt DQ 0 DW -1,0,9a00h,0 DW -1,0,9200h,0cfh DQ 0
Old_GDTR DW 0,0,0 GDTR DW 0,0,0 _Exit: Endm
在这里为了方便我只把FS改成4GB段,读者可以按需要自行决定使用哪个段寄存器。只要将这段代码拷贝到你的程序中,然后在开始的时候调用它,就可以通过该段寄存器直接访问大内存了,爽吧!
最后还有一点一定要注意:如果你的程序运行时有任何扩展内存管理程序存在(HIMEM、EMM386等)都要千万小心,因为很容易会破坏到它们的内部数据或其他程序的数据,如果是这样就只有死机一条路可走了。切记切记!我的建议是最好从内存顶端开始使用扩展内存。这时破坏其他数据的可能要小一些。 |