Методические указания по лабораторным работам по курсу «Аппаратные средства компьютерных систем», страница 4

Для идентификации 16-битных процессоров анализируют значение регистра флагов, сохраненного инструкцией PUSHF после попыток его модификации. Свойства регистра используют при идентификации типа процессора в следующем порядке.

1.   У процессоров 8086/88 биты 12—15 всегда установлены, и попытка сбросить их не удается.

2.   У процессоров 80286 в реальном режиме биты 12—15 всегда сброшены; у 32-битных процессоров в реальном режиме бит 15 сброшен всегда, а биты 12—14 хранят последнее загруженное в них значение. В защищенном режиме бит 15 сброшен всегда, а бит 14 хранит последнее в него загруженное значение (биты 12, 13 можно изменить только при IOPL=0).

С целью идентификации 32-битных процессоров анализируется содержимое EFLAGS:

—  бит 18 определен у процессоров, начиная с 80486, поэтому в 80386 его невозможно изменить;

—  бит 21 определяет возможность использования инструкции CPUID. Признаком доступности инструкции является возможность программного изменения его значения.

Для обращения к регистрам FLAGS, EFLAGS используются команды POPF, POPFD, PUSHF и PUSHFD. Фрагмент программы, определяющей тип процессора 8086/8088 по регистру флагов, приведен на рисунке 1.2.

       pushf         ;сохранить EFLAGS

       pop   bx      ;восстановить EFLAGS в BX

       mov   ax,0fffh ;очистить биты 12-15 в EFLAGS

       and   ax,bx

       push  ax      ;сохранить новое значение EFLAGS

       popf

       pushf         ;установить новый EFLAGS

       pop   ax      ;сохранить новый EFLAGS в AX

       mov   cx,0F000H

       and   ax,cx   ;если биты 12-15 установлены,

       cmp   ax,cx   ;это процессор 8086/8088

       jne   non_8086 ;переход, если не 8086/8088

       jmp   pechat  ;печать типа процессора

non_8086:

Рисунок 1.2

BIOS может получить информацию о типе 32-разрядного процессора в виде сигнатуры идентификации, которая формируется в регистре EDX непосредственно после сигнала RESET. Рисунок 1.3 показывает содержимое регистра EDX микропроцессоров, начиная с i486. Назначение полей сигнатуры микропроцессора i386 (рисунок 1.4) отличается от приведенного на рисунке 1.3.

Процессоры, выполняющие команду CPUID, также возвращают сигнатуру идентификации процессора, однако команда CPUID дает возможность проверки сигнатуры в любое удобное время без его сброса. Следует помнить, что ранние версии процессоров Intel486 SX, Intel486 DX и IntelDX2 не поддерживают команду CPUID, и поэтому их сигнатуру можно получить только при сбросе.