Фантазии о Вселенной и мой личный сайт
Регистры управления

Регистры управления

Все 32-разрядные процессоры, начиная с i386, имеют набор системных регистров, предназначенных для использования в защищённом режиме. Среди них есть регистры управления (Control Registers) CR0, CR1, CR2, CR3 и CR4.

Регистры управления, в основном, состоят из флагов. Назначение и использование каждого флага достаточно сложно и требует отдельного рассмотрения. Для начала мы рассмотрим только один бит PE регистра CR0, отвечающего за переход процессора в защищённый режим и обратно. Полный список с описаниями регистров CRi приводится в приложении "Регистры управления CRi".

Регистры управления предназначены для считывания и записи информации. Они имеют размер в 32 бита и оперировать ими можно только целиком - считали значение целого регистра, изменили нужные биты и записали обратно. Единственная команда, которой позволен доступ к этим регистрам - это MOV, в качестве операнда которой используется 32-разрядный регистр общего назначения.

В дальнейших главах мы будем рассматривать переход в защищённый режим и возврат из него в режим реальных адресов, для чего будем использовать только один бит из регистра CR0 - это нулевой бит, который называется PE (Protection Enable). Если установить этот бит в 1, процессор перейдёт в защищённый режим, если сбросить - то в режим реальных адресов.

Процессор после аппаратного сброса переходит в режим реальных адресов и бит PE сброшен.

Вот примеры использования бита PE:

Переводим процессор в защищённый режим.

mov    eax, cr0    ; Копируем в EAX содержимое регистра CR0.
or     al, 1       ; Устанавливаем в копии 0-й бит, который соответствует 0-му биту CR0, т.е. биту PE.
mov    cr0, eax    ; Записываем в CR0 обновлённое значение. Процессор перешёл в защищённый режим.

; 1-я команда программы, которая выполнится в защищённом режиме.

Переводим процессор в режим реальных адресов.

mov    eax, cr0
and    al, 0feh     ; Сбрасываем бит PE.
mov    cr0, eax     ; Процессор перешёл в режим реальных адресов.

На самом деле, если вы просто выполните переход в защищённый режим, как показано на приведенном выше примере, то процессор зависнет. Для работы в защищённом режиме процессор использует дескрипторы сегментов, вместо их адресов (которые находятся в сегментных регистрах), поэтому прежде, чем перевести процессор в защищённый режим, нужно провести некоторые подготовительные работы.