hsh000
驱动牛犊
驱动牛犊
  • 注册日期2002-02-05
  • 最后登录2005-04-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:954回复:2

救命啊

楼主#
更多 发布于:2002-10-08 16:22
我进入不了保护模式,dos622下运行死机
好像是改写cr0寄存器所致


void openA20()
{
        asm push    ax
asm          in      al,92h
        asm or      al,00000010b
asm         out     92h,al
        asm    pop     ax
}


void set4gb()
 {
   unsigned int aa;
   unsigned short bb=0;
   aa = 100;
asm cli
asm push ds
asm  push es
asm mov word ptr GDT_Addr[0], (2*8-1) //GDT的长度存入GDT_Addr中
asm mov eax,ds //计算GDT描述符表的线性基地址31-0
asm shl eax,4 //段地址eax=ds×16
asm xor ebx,ebx //ebx清零
asm mov bx,offset GDT_def //bx=GDT的偏移地址
asm add eax,ebx //GDT的线性基地址=eax+ebx
asm mov dword ptr GDT_Addr[2],eax //GDT的线性基地址存入GDT_Addr中
asm lgdt fword ptr GDT_Addr
asm mov bx,8 //设置数据段描述符的选择字
openA20();
// asm smsw ax
// asm mov bb, al
//printf(\"bb is %d\\n\", bb);
asm mov eax,cr0
asm mov aa, eax
printf(\"aa is %d\\n\", aa);
getchar();
asm or al,1
asm mov cr0,eax
printf(\"good\\n\");
asm jmp flush1 //进入保护方式
flush1: asm mov ds,bx //DS装载具有4GB界限的数据段描述符
asm mov es,bx //ES装载具有4GB界限的数据段描述符
asm and al,0feh
asm mov cr0,eax
asm jmp flush2 //返回实方式
flush2: asm pop es
asm pop ds
asm sti
}
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-09 14:40
同志你好,你太抠了,只给2分,不行!我只能简单回答你,不能随便改CR0!!!
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
hsh000
驱动牛犊
驱动牛犊
  • 注册日期2002-02-05
  • 最后登录2005-04-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-11 14:32
跟我说了,我另外给分(私下里)

别人的程序可以修改cr0
我为什么不能?怎样修改
请您一定要赐教!!!!!!!!!!!!!!!!!!!!
游客

返回顶部