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

           popf                                                                         { Вiдновити AC бiт в EFLAGS }

   @80486:                                                    { Перевipка МП i486 i наступних моделей: }

                                                   { установка/скидання ID прапору (бiт 21) в EFLAGS }

                                           { вказує на виконуємість команди CPUID на даному МП }

           mov cpu_type,4                                                                    { Мiкропроцесор: i486 }

           db 66h

           mov ax,cx                                                          { Одержати початковий EFLAGS }

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

           dd 200000h

           db 66h

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

           db 66h

           popf                                                              { Занести  нове значення в EFLAGS }

           db 66h

           pushf                                                                                     { Записати його в стек }

           db 66h

           pop ax                                                                                      { Переписати в EAX }

           popf                                                                           { Вiдновити FLAGS/EFLAGS }

           db 66h

           xor ax,cx                                                                         { Якщо бiт ID не мiнявся: }

           je @end_cpuid                                              { МП не пiдтpимує команду CPUID }

{---Виконанння команди CPUID для визначення фирми, сiмейства, моделi МП---}

           mov id_flag,1               { Установка прапору виконання МП команди CPUID }

           db 66h

           xor ax,ax                                                               { Параметр для CPUID: EAX=0 }

           db 0fh,0a2h                                                                                   { Команда CPUID }

           db 66h

           mov  ss:[bp+offset vend],bx                                                       { Iз pегiстpiв EBX, }

           db 66h                                                                                                                { EDX }

           mov ss:[bp+offset vend+4],dx                                                                        { i ECX }

           db 66h                                                                           { в змiнну vend заноситься }

           mov ss:[bp+offset vend+8],cx                                                           { назва фирми }

           cmp al,1                                   { В AL - найбiльше значення параметра CPUID }

           jl @end_cpuid

           mov par,al

           db 66h

           xor ax,ax

           db 66h

           inc ax                                                               { Установка параметра CPUID = 1 }

           db 0fh,0a2h                                          { Команда CPUID: в AL - сигнатура МП }

           db 66h                                                                         { В sn_3 - старшi 32 розряди }

           mov word ptr sn_3,ax                                                       { серiйного номера МП }

           db 66h

           mov word ptr EBX_,bx{ В  EBX_- Brand ID та ін.}

           db 66h

           mov word ptr ECX_,cx { В  EСX_- особливостi МП (EСX) }

           db 66h

           mov word ptr feature,dx                              { В  feature- особливостi МП (EDX) }

           mov cx,ax

           and ax,0f0h

           db 0c1h,0e8h,4                                               { Зсув в AX на 4 розряди праворуч }

           mov model, al                                                                          { В AL - модель МП }

           mov ax,cx