Программная модель МП-системы на основе процессора Pentium. Особенности организации памяти и допустимые способы адресации, страница 9

31

30

29

18

16

15      6

5

4

3

2

1

0

PG

CD

NW

резерв

AM

WP

резерв

NE

ET

TS

EM

MP

PE

CR0

Линейный  адрес  страничной ошибки

CR2

31                                                            12

11              5

4

3

2       0

 

Базовый адрес каталога страниц

резерв

PCD

PWT

резерв

CR3

31                                            7

6

5

4

3

2

1

0

MSE

0

PSE

DE

TSD

PVI

VME

CR4

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

Рис. Системная архитектура процессора Pentium

Регистр сегмента данных DS (Current Date Segment) указывает начало области адресов памяти, в которой в общем случае размещаются программно изменяемые таблицы и данные. Все прямые и косвенные адресные ссылки к операндам в выполняемых командах определяются относительно регистра DS. При формировании адресов данных содержимое регистра DS суммируется с исполнительным адресом ЕА (смещением), вычисляемым в операционном блоке. Исключения составляют данные, для которых смещение формируется через базовый регистр ВР или стековый регистр SP. Такая организация памяти, при которой все данные группируются в отдельном сегменте и не попадают в сегмент, хранящий коды команд, упрощает их использование и исключает не предусмотренные алгоритмом разрушения команд и данных.

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

Регистр стекового сегмента SS (Current Stack Segment) используется для запоминания начального адреса сегмента, выделенного под стек. Все обращения к стеку, в том числе неявные действия при прерываниях, обращениях к подпрограммам и при возврате из них, а также явные операции загрузки стека и извлечения из стека осуществляются с использованием регистра SS и регистров-указателей стека ЕBP и ESP, задающих смещение внутри стекового сегмента. В отличие от регистра CS регистр SS может быть загружен явно, что позволяет прикладным программам определять собственные стеки.

Указатель стека ESP (Stack Pointer) содержит смещение вершины стека в текущем сегменте стека. Он используется при вызове подпрограмм и при возврате из них, а также в случае поступления прерываний или исключений. Указатель базы кадра стека EBP (Stack Frame Base Pointer) предназначен для доступа к структурам данных стека. В отличие от указателя стека ESP, который изменяет свое содержимое при записи или чтении данных из стека, указатель базы может быть использован для доступа к структурам данных стека с фиксированным смещением. В частности, команды ENTER и LEAVE используют указатель базы EBP для удобного доступа к переменным.

При обращении к данным выбор сегментного регистра и способа вычисления исполнительного адреса ЕА зависят от типа обращения к памяти. Большинство команд процессора оперируют только внутрисегментным смещением, при этом сам сегмент непосредственно в команде не указывается: он адресуется неявно кодом операции.