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

        desc_L2:word;                                                                        { Дескриптор кеша L2 }

                                                                                   { Серiйний номер мiкропроцесора: }

        sn_1,                                                                                         { молодшi 32 розряди, }

        sn_2,                                                                                            { середнi 32 розряди, }

        sn_3:longint;                                                                                { старшi 32 розряди }

        vend:array[1..12] of char;                                             { Назва фiрми-виготiвника }

        brand_str:array[1..48] of char; { Бренд-строка фiрми-виготiвника }

        typ,                                                                                                                { Тип МП  }

        model,                                                                                                    { Модель МП  }

        i,j,

        id_flag,                                                  { Пpапоp виконання МП команди CPUID }

        cpu_type,       { Номер типу МП  }

brand,                                       { Брэнд ID }

CLFSH,  { Довжина рядка кеша }

NMP,         { Число логічних процесорів в кристалі }

        par:byte;                         { Число параметрiв команди CPUID }

       uknown:boolean;                    { Ознака невизначення типу МП }

        s:string;

      begin

        id_flag:=0;

unknown:=false;

        asm

           pushf                                                                                             { Збеpегти FLAGS }

     @8086:                                                                                       { Перевiрка МП i8086: }

                                                           { бiти 12-15 pегiстpу FLAGS завжди встановленi }

           pushf

           pop ax

           mov cx,ax

           and ax,0fffh

           push ax

           popf

           pushf

           pop ax

           and ax,0f000h

           cmp ax,0f000h

           mov cpu_type,0                                                                   { Мiкропроцесор: 8086 }

           jne @80286

           jmp @end_cpuid

   @80286:                                                                                     { Перевiрка МП i80286:  }

                             { бiти 12-15 pегiстpу FLAGS в pеальному режимi завжди скинутi }

           or cx,0f000h

           push cx

           popf

           pushf

           pop ax

           and ax,0f000h

           mov cpu_type,2                                                                 { Мiкропроцесор: 80286 }

           jnz @80386

           jmp @end_cpuid

   @80386:                                                                                     { Перевiрка МП i80386: }

                         { прапор AC (бiт 18) pегiстpа  EFLAGS не може бути встановлений }

           db 66h                                                             { Префiкс розрядностi: 32 розряди }

           pushf             { Запис в стек вихiдного EFLAGS }

           db 66h

           pop ax            { Занести в EAX вихiдний EFLAGS }

           db 66h

           mov cx,ax       { Збеpегти вихiдний EFLAGS в ECX }

           db 66h,35h    { Змiнити командою XOR бiт AC в EFLAGS }

           dd 040000h

           db 66h

           push ax      { Збеpегти нове значення EFLAGS в стеку }

           db 66h

           popf               { Змiнити поточне значення EFLAGS }

           db 66h

           pushf

           db 66h

           pop ax      { Запам'ятати нове значення EFLAGS в EAX }

           db 66h

           xor ax,cx

           mov cpu_type,3

           jz @end_cpuid       { Якщо бiт AC не змiнюється: }

           db 66h                           { мiкропроцесор: 80386 }

           push cx

           db 66h