Collins Chen wrote:
> 
> Dear Ebiederman,
>      Thank you! I have add ".code16" at protected mode or real mode, then the
> machine code is right: "e8 01 00". But CPU still fetch code incorrectly. I guess
> my code don't back to real mode, it seem to still in protected mode.
> I don't know what is wrong with my code. So strange???
> 


AFIAK, you have to prepare GDT with 32-bit and 16-bit descriptors. When
entering protect mode, "ljmp $PROTECT_MODE_SELECTOR, offset", when
leaving protect mode, "ljmp $REAL_MODE_SELECTOR, offset". Seting PE
bit in CR0 is only have way. Did you read the Intel manul vol. 3 ??

Ollie


> Regards,
> Collins
> 
> 
> 
> 
> 
> 
> 
> [EMAIL PROTECTED] (Eric W. Biederman) on 2002-02-28 01:18:48
>                                                               
>                                                               
>                                                               
>   To:          Collins Chen/ALI_ZSZ/ACER@ACER                 
>                                                               
>   cc:          Ronald G Minnich <[EMAIL PROTECTED]>, Jeffrey  
>                W.C. Chen/ALI_TPE/ACER@ACER,                   
>                [EMAIL PROTECTED]                             
>                                                               
>                                                               
>                                                               
>   Subject      Re: Why CPU don't execute 16-bit code          
>   :                                                           
>                                                               
> 
> 
> 
> 
> 
> 
> 
> "Collins Chen" <"collins_chen"@ali.com.tw> writes:
> 
> 
>>Hi Ron,
>>     In ipl.S the machine code "e8 01 00" (is a short call) can execute
>>
> because
> 
>>in real mode.
>>     In start32.inc the same machine code "e8 01 00" can't execute because in
>>protected mode, I find in protected mode, CPU always fetch 4 bytes as offset
>>after machine code "e8". So I must back to real mode before invoke vga bios,
>>
> but
> 
>>then CPU still fetch 4 bytes as offset like in protected mode. I think maybe
>>
> my
> 
>>code about back real mode is wrong. Can you give me some advice?
>>     BTW, if CPU can execute "e8 01 00" correctly in protected mode?
>>
> 
> Your code goes to real mode but it doesn't switch to 16bit mode.  I'm
> not quite certain how such a contradiction can exist but it does.
> 
> Switch to a 16bit protected mode segment before switching to real mode
> and it should work.
> 
> Eric
> 
> 
> 
>>Regards,
>>Collins
>>
>>my code:
>>
>>     movl %cr0, %eax          /*exit protected mode*/
>>     andb $0xfe, %al
>>     movl %eax, %cr0
>>
>>     ljmp $0x8000, $realcc
>>/*   jmp  realccc    */
>>realcc:
>>
> 
> 
> 
> 



Reply via email to