突破DOS实模式限制直接访问4GB内存

文章作者 100test 发表时间 2008:01:11 13:11:16
来源 100Test.Com百考试题网


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等)都要千万小心,因为很容易会破坏到它们的内部数据或其他程序的数据,如果是这样就只有死机一条路可走了。切记切记!我的建议是最好从内存顶端开始使用扩展内存。这时破坏其他数据的可能要小一些。



相关文章


如何让你的SQL运行得更快
在ORCAL中实现数据库的复制
子程序的调用和返回指令
汇编实现显示键盘ASCII值源代码
突破DOS实模式限制直接访问4GB内存
tsr技术给dos装上黑匣子
SQL语句基础学习之函数
SQL语句基础学习之COUNT
SQL语句基础学习之HAVING
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛