Для идентификации 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, и поэтому их сигнатуру можно получить только при сбросе.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.