Управляющий регистр CR0 включает ряд флагов, управляющих различными режимами работы микропроцессора. Он появился в процессоре 80386, однако его непосредственным предком, ставшим его младшей половиной, было слово состояния машины (MSW), появившееся в процессоре 80286.
Современный формат регистра CR0 показан на рисунке:
Разряды регистра CR0 имеют следующее назначение.
PE | Разрешение защиты (бит 0). Когда установлен, включает защищённый режим работы процессора. При его сбросе процессор возвращается в реальный режим. В микропроцессоре 80286 программно сбросить этот разряд было невозможно. |
MP | Контроль сопроцессора (бит 1). Управляет реакцией инструкции WAIT/FWAIT на флаг TS регистра CR0. Когда оба флага установлены, эта инструкция будет генерировать исключение #NM (вектор 7). Если же MP сброшен, инструкция WAIT/FWAIT игнорирует состояние флага TS. |
EM | Эмуляция сопроцессора (бит 2). Когда установлен, означает, что математический сопроцессор отсутствует, когда сброшен — что присутствует. Установка этого флага вызывает генерацию исключения #NM (вектор 7) при попытке выполнить любую команду сопроцессора или набора MMX, а также почти любую команду SSE (исключением являются команды PAUSE, PREFETCHn, SFENCE, LFENCE, MFENCE, MOVNTI и CLFLUSH, игнорирующие состояние этого флага). |
TS | Задача переключена (бит 3). Устанавливается процессором при каждом переключении задач, сбрасывается программно (загрузкой CR0 или специальной командой CLTS). Этот флаг влияет на выполнение команд сопроцессора, MMX и SSE по нижеследующим правилам:
|
ET | Тип расширения (бит 4). Показывает наличие (установлен) или отсутствие (сброшен) математического сопроцессора. Во всех процессорах, начиная с Pentium, всегда установлен. Программно этот разряд изменить нельзя. |
NE | Ошибка сопроцессора (бит 5). Когда установлен, разрешает «естественный» механизм уведомления об ошибках, возникающих при работе сопроцессора; когда сброшен, об ошибках сообщается в стиле, принятом в IBM PC, когда сопроцессор был внешней микросхемой — через контроллер прерываний. |
WP | Защита от записи (бит 16). Когда установлен, запрещает запись в страницы, доступные прикладным программам только на чтение, со стороны кода, выполняющегося на нулевом текущем уровне привилегий (CPL). Если этот флаг сброшен, код нулевого уровня может выполнять запись в такие страницы. Этот механизм облегчает создание новых процессов методом «копирования при записи», что используется в Unix-подобных ОС. |
AM | Маска выравнивания (бит 18). Разрешает контроль выравнивания операндов. Если установлен этот флаг и бит AC в регистре флагов, то при попытке обратиться к невыровненным операндам из программы, работающей на третьем текущем уровне привилегий (CPL), возникнет прерывание #AC (вектор 17). Если хотя бы один из указанных флагов сброшен или же выполняется программа с численно меньшим текущем уровне привилегий, обращение к невыровненным операндам прерывания не вызывает. |
NW | Запрет сквозной записи (бит 29). Управляет работой кэша (подробно об этом говорится в разделе Управление кэшированием). |
CD | Запрет кэширования (бит 30). Управляет работой кэша (подробно об этом говорится в разделе Управление кэшированием). |
PG | Страничный режим (бит 31). Установка этого разряда включает страничный механизм процессора, сброс — отключает его. Установка флага PG при сброшенном PE вызывает общее нарушение защиты (#GP, вектор 13). |