3. Ресурсы микропроцессора    
 СОДЕРЖАНИЕ
 Введение
 1. Развитие архитектуры
 2. Структура МП
 3. Ресурсы МП
 4. Управление памятью
 5. Защита
 6. Многозадачность
 7. Прерывания и исключения
 8. Инициализация МП
 9. Эмуляция 8086
 Глоссарий
 ПРАКТИКА
 1. Семантический разрыв
 2. CPUID
 3. Защищенный режим
 Вопросы и задания

3.3 Регистры

Регистр является устройством временного хранения данных и используется с целью облегчения арифметических, логических и пересылочных операций. Регистры 32-битных моделей IA-32 являются расширением регистров 16-битных моделей семейства.

Регистры общего назначения

Восемь регистров общего назначения имеют длину в 32 бит и содержат адреса или данные. Они поддерживают операнды-данные длиной 1, 8, 16, 32 и (при использовании двух регистров) 64 бит; битовые поля от 1 до 32 бит; операнды-адреса длиной 16 и 32 бит. Эти регистры называются EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP. Доступ к младшим 16 бит этих регистров выполняется независимо при использовании соответствующих имен 16-битных регистров: AX, BX, CX, DX, SI, DI, BP и SP. Также могут использоваться индивидуально младший (биты 0-7) и старший (биты 8-15) байты регистров AX, BX, CX, DX. Им соответствуют обозначения AH, DH, CH, BH и AL, DL, CL, BL. Формат регистров общего назначения показан на рисунке.


31

23

15

7
0
 
AH
AL
  EAX
 
DH
DL
  EDX
 
CH
CL
  ECX
 
BH
BL
  EBX
 
  EBP
 
  ESP
 
  ESI
 
  EDI

Хотя регистр ESP тоже относится к регистрам общего назначения, он содержит указатель на вершину стека и его не стоит использовать для других целей.

Следует отметить, что регистры могут быть неравнозначны и при использовании определенных инструкций могут иметь специальное значение:

Сегментные регистры

Микропроцессор 80386 включает шесть непосредственно доступных 16-битных регистров селекторов сегментов. С каждым сегментным регистром ассоциирован программно-недоступный кэш дескриптора соответствующего сегмента, содержащий базовый адрес сегмента в линейном адресном пространстве, предел сегмента и атрибуты сегмента. Этот кэш заполняется при загрузке значения в сегментный регистр. В реальном режиме предел сегмента всегда 0FFFFh, атрибуты игнорируются, а базовый адрес вычисляется сдвигом значения селектора на 4 бита влево. В защищенном режиме кэш заполняется соответствующими значениями из дескрипторной таблицы.


15

7
CS
 
линейный базовый адрес
предел
атрибуты
SS
 
линейный базовый адрес
предел
атрибуты
DS
 
линейный базовый адрес
предел
атрибуты
ES
 
линейный базовый адрес
предел
атрибуты
FS
 
линейный базовый адрес
предел
атрибуты
GS
 
линейный базовый адрес
предел
атрибуты
  Программно-недоступные поля (загружаются автоматически)

Значения селекторов могут быть загружены при исполнении программы и являются специфичными для задачи. Это значит, что регистры сегментов в защищенном режиме перезагружаются автоматически при переключении микропроцессора на другую задачу. В то же время, использование сегментных регистров зависит от того, какая модель адресного пространства используется. При использовании сплошной модели в сегментные регистры загружается один и тот же селектор сегмента с базой 0 и пределом 0FFFFFFFFh, обеспечивая доступ ко всему линейному адресному пространству. При использовании сегментированной модели значения селекторов в сегментных регистрах независимы, так что программа может одновременно обращаться к шести сегментам.

Не все сегментные регистры равнозначны. Регистр CS хранит селектор сегмента кода. Процессор извлекает очередную инструкцию для исполнения, формируя логический адрес из селектора в CS и смещения в регистре EIP. Значение этого регистра нельзя изменить непосредственно, оно меняется в командах межсегментного перехода (FAR JMP), межсегментного вызова (FAR CALL), при вызове обработчика прерывания (INT) и при возврате из дальней процедуры (RETF) или обработчика прерывания (IRET).

Регистр SS хранит селектор сегмента стека. Стек используется для передачи параметров подпрограммам и для сохранения адреса возврата при вызове подпрограммы или обработчика прерывания. Вершиной стека считается байт, логический адрес которого образуется из селектора в регистре SS и смещения в регистре ESP. Программа может непосредственно изменить значение SS, что дает ей возможность переключаться между несколькими стеками. Причем на время выполнения команды MOV SS,xxxx и одной команды следующей за ней (обычно это MOV ESP,xxxx) запрещаются маскируемые и блокируются немаскируемые прерывания.

Регистры DS, ES, FS и GS хранят селекторы сегментов данных. Если инструкция обращается к памяти, но содержит только смещение, то считается, что она обращается к данным в сегменте DS. Сегмент ES может использоваться без явного указания в цепочечных командах. Сегменты FS и GS используются при обращении к памяти только при явном использовании в инструкции префиксов этих сегментов.

Указатель команд

Указатель команд (EIP) является 32-разрядным регистром. Он содержит смещение следующей команды, подлежащей выполнению. Относительный адрес отсчитывается от начала сегмента исполняемой задачи. Указатель команд непосредственно недоступен программисту, но он управляется явно командами управления потоком, прерываниями и исключениями (JMP, CALL, RET, IRET, команды условного перехода). Получить текущее значение EIP можно, если выполнить команду CALL, а затем прочитать слово на вершине стека.

Младшие 16 бит регистра EIP обозначаются IP и могут быть использованы процессором независимо при исполнении 16-битного кода.

Регистр системных флагов

Регистр EFLAGS содержит группу флагов состояния, управления и системных флагов. Младшие 16 бит регистра представляют собой 16-разрядный регистр флагов и состояния МП 8086, называемый FLAGS, который наиболее полезен при исполнении программ для МП 8086 и 80286. Структура регистра флагов показана на рисунке. Неопределенные биты зарезервированы, то есть на данный момент они не имеют значения, однако могут быть использованы для специальных целей в последующих версиях микропроцессора. Далее термин "установлен" означает значение 1, а термин "сброшен" - значение 0.

Некоторые из флагов могут быть изменены специально предназначенными для этой цели инструкциями. Для изменения или проверки группы флагов можно воспользоваться командами:

EFLAGS

Флаги статуса CF, PF, AF, ZF, SF и OF отражают статус выполнения арифметических инструкций (таких как ADD, SUB, MUL, DIV).

DF - флаг направления (Direction Flag) управляет поведением цепочечных инструкций (MOVS, CMPS, SCAS, LODS, STOS). Когда флаг сброшен, при выполнении цепочечной команды происходит автоинкремент адресов источника и приемника. Когда флаг установлен - автодекремент. Флаг можно непосредственно установить при помощи инструкции STD и сбросить при помощи CLD.

Системные флаги и поле IOPL влияют на процесс исполнения задачи, и поэтому не должны изменяться прикладной программой. Назначение этих флагов следующее:

Регистры управления сегментированной памятью

Эти регистры также известны как регистры системных адресов. Четыре регистра указывают на структуры данных, которые управляют механизмом сегментированной памяти. Они определены для ссылок на таблицы или сегменты, поддерживаемые моделью защиты микропроцессора.

Регистр глобальной дескрипторной таблицы (GDTR). Содержит 32-разрядный линейный адрес и 16-разрядную границу глобальной дескрипторной таблицы. Значение этого регистра можно загрузить/сохранить при помощи привилегированных инструкций LGDT/SGDT. В реальном режиме этот регистр не используется. Перед переходом в защищенный режим в этот регистр следует загрузить корректные значения.

Регистр локальной дескрипторной таблицы (LDTR). Содержит 16-разрядный селектор локальной дескрипторной таблицы. С регистром связан программно-недоступный кэш дескриптора для хранения базового адреса, предела и атрибутов соответствующей дескрипторной таблицы. Значение этого регистра можно загрузить/сохранить при помощи привилегированных инструкций LLDT/SLDT. В реальном режиме этот регистр не используется и попытка обращения к нему генерирует особый случай "недействительный код операции" (исключение #6). С каждой задачей в защищенном режиме может быть связана своя локальная дескрипторная таблица, поэтому селектор LDT хранится в TSS и автоматически загружается при переключении задач.

Регистр таблицы дескрипторов прерываний (IDTR). Указывает на таблицу точек входа в программы обработки прерываний. Регистр содержит 32-разрядный линейный базовый адрес и 16-разрядный предел таблицы. Значение этого регистра можно загрузить/сохранить при помощи привилегированных инструкций LIDT/SIDT. При инициализации процессора базовый адрес IDT устанавливается в 0, а предел - 0FFFFh. В реальном режиме эта таблица хранит 4-байтные вектора прерываний, а в защищенном - дескритпоры шлюзов обработчиков прерываний и исключений. Это единственный регистр среди перечисленных, который используется в реальном режиме.

Регистр задачи (TR). Указывает на информацию, необходимую процессору для определения текущей задачи. Регистр содержит 16-разрядный селектор дескриптора сегмента состояния задачи. С регистром связан программно-недоступный кэш дескриптора TSS для хранения базового адреса, предела и атрибутов соответствующего сегмента состояния задачи. Значение этого регистра можно загрузить/сохранить при помощи привилегированных инструкций LTR/STR. В реальном режиме этот регистр не используется и попытка обращения к нему генерирует особый случай "недействительный код операции" (исключение #6).


47

39

31

23

15

7
0
32-битный линейный базовый адрес
16-битный предел
  GDTR
32-битный линейный базовый адрес
16-битный предел
  IDTR

15

7

0

 

 

 

 
селектор
  LDTR
32-битный линейный базовый адрес
16-битный предел
атрибуты
селектор
  Task Register
32-битный линейный базовый адрес
16-битный предел
атрибуты
Программно-недоступные поля (загружаются автоматически)

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

Микропроцессор имеет четыре 32-разрядных регистра управления CR0-CR4 (CR1 - зарезервирован), в которых хранятся флаги состояния процессора или глобальные флаги. Вместе с регистрами системных адресов эти регистры хранят информацию о состоянии процессора, которое влияет на все задачи в системе. Системным программистам регистры управления доступны только через варианты команды MOV, которые позволяют их загружать или сохранять в регистрах общего назначения. Формат четырех регистров представлен на рисунке.

CR0-CR4

Регистр CR0 содержит флаги, которые управляют или показывают условия, относящиеся к системе в целом, а не к отдельной задаче. Младшие 16 бит (биты с 0 по 15) этого регистра называются словом состояния машины (Machine Status Word - MSW) для совместимости с МП 80286.

Регистр CR2 используется для обработки страничного нарушения, если установлен бит PG в регистре CR0. В регистре CR2 процессор сохраняет тот линейный адрес, который вызвал исключение. Код ошибки, запоминаемый при возникновении отказа в стеке обработчика страничного нарушения, обеспечивает дополнительную информацию о состоянии при этом исключении.

Регистр CR3 используется, когда установлен бит PG в регистре CR0. Этот регистр известен также как регистр каталога таблиц страниц (Page Directory Base Register - PDBR) Он позволяет процессору определить место расположения каталога таблиц страниц для текущей задачи. В старших 10 битах он содержит физический базовый адрес каталога таблиц страниц. Каталог таблиц страниц микропроцессора всегда выравнивается на размер страницы в 4Кбайт. Специальное назначение имеют биты 3 и 4, управляющие кэшированием страницы, на которой находится каталог таблиц:

Регистр CR4 управляет использованием тех или иных архитектурных расширений процессоров Pentium и более новых. Какими возможностями обладает процессор, можно узнать по результатам выполнения команды CPUID(1).

Регистры отладки

Шесть доступных регистров отладки (DR0-DR3, DR6, DR7) расширяют возможности отладки МП. Они устанавливают точки останова по данным и позволяют устанавливать точки останова по командам без модификации сегментов программ. Регистры DR0-DR3 предназначены для хранения четырех линейных адресов точек останова. Регистры DR4 и DR5 зарезервированы. Формат регистров DR6 и DR7 показан на рисунке.

DR6-DR7

Регистр DR6 показывает текущее состояние точек останова:

Регистр DR7 задает условие для точек останова: