阅读:954回复:2
救命啊
我进入不了保护模式,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 } |
|
沙发#
发布于:2002-10-09 14:40
同志你好,你太抠了,只给2分,不行!我只能简单回答你,不能随便改CR0!!!
|
|
|
板凳#
发布于:2002-10-11 14:32
跟我说了,我另外给分(私下里)
别人的程序可以修改cr0 我为什么不能?怎样修改 请您一定要赐教!!!!!!!!!!!!!!!!!!!! |
|