Організація роботи мiкропроцесора в захищеному режимi, страница 14

 { який записаний з кодом, який прочитаний}

       jnz @6         { Якщо коди не рiвнi, тобто адреса бiльше }

                                        нiж ємність пам'ятi комп'ютера - закiнчити аналiз пам'ятi }

       db 66h,43h                                      { INC EBX - збiльшення на 1 адреси поточної }

       db 67h                                                                                               { комiрки пам'ятi }

       loop @5                                                                                    { i перехiд до її аналiзу }

    @6:db 66h

       mov word ptr mem_size,bx       { Запис в mem_size з EBX }

     end;{know_mem_size}                                 { значення знайденого розмiру пам'ятi }

  begin

    clrscr;

{-----------------------------Визначення типу мiкропроцесора----------------------------------}

    get_cpu_type(0,cpu_type);                                           { В cpu_type - номер типу МП }

{---------------------------------Формування таблицi GDT---------------------------------------}

    { Нуль-дескриптор: }

    init_gdt(0,0,0,0,0);

                                    { Дескриптор сегмента коду: }

    init_gdt(1,$ffff,lin_adr(cseg,0),acc_code,0);

 { Дескриптор сегмента даних: }

    init_gdt(3,$ffff,lin_adr(dseg,0),acc_data,0);

  { Дескриптор сегмента стека: }

    init_gdt(4,0,lin_adr(sseg,0),acc_stack,0);

                                                                                { Дескриптор сегмента вiдеопам'ятi: }

    init_gdt(5,4000-1,lin_adr($b800,0),acc_data,0);

                                                                   { Дескриптор сегмента розширеної пам'ятi: }

    init_gdt(6,$fffff,1024*1024,acc_data,$80);

{-----------------Формування даних регістра GDTR i його завантаження----------------}

    init_gdtr;

{------------------------Пiдготовка до повернення в реальний режим-----------------------}

{------------------через скидання мiкропроцесора (тiльки для МП 80286)----------------}

    if cpu_type=2 then begin

       asm                                                              { В змiнну ofs_ret заноситься змiщення }

          mov ofs_ret,offset ret_r           { мiтки повернення }

    end;                               { в реальний режим ret_r }

    save_ret_real(Cseg,ofs_ret,$A);      { Процедура забезпечує }

    end;                                                        { перехiд на мiтку ret_r пiсля скидання МП }

{--------------------Заборона маскуємих i немаскуємих переривань-------------------------}

    not_int;

{-----------------------Зберiгання змiсту регiстрiв DS, SS, ES i SP---------------------------}

    save_sreg;

    real_sp:=SPtr;

    if cpu_type=2 then

{------------------------Перехiд в захищений режим для МП 80286---------------------------}

    asm                   { Установка біта PE = 1 в регiстрi MSW: }

        db 0fh,01h,0e0h                               { SMSW AX }

        or ax,1

        db 0fh,01h,0f0h                               { LMSW AX }

    end else

{-------------------Перехiд в захищений режим для МП 80386 i вище----------------------}

    asm        { Установка біта PE = 1 в регiстрi управлiння CR0: }

       db $0f,$20,0c0h                            { MOV EAX,CR0 }

       db 66h,0dh                                    { OR EAX,1 }

       dd 1h

       db $0f,22h,0c0h                            { MOV CR0,EAX }

    end;

    asm

       jmp @prot         { Перехiд для очистки буфера команд МП }

{-----------------------------------Робота в захищеному режимi---------------------------------}

{ Завантаження сегментних регiстрiв }

 @prot:mov ds,data_sel                     { DS }

  mov ss,stack_sel{ SS }

           mov es,video_sel                                                { i ES вiдповiдними селекторами }

{------------------------------------Виведення на екран рядка-------------------------------------}

       call out_screen;

       cmp cpu_type,2

       jnz @mem