Базовая регистровая архитектура процессоров семейства Х86, страница 2

ESI/SIиндекс источника (Source Index). При реализации цепочечных операций, этот регистр адресует в соответствующем сегменте текущий элемент цепочки – источника. При этом осуществляется автоматический инкремент/декремент содержимого данного регистра. Может также использоваться при формировании эффективных адресов.

EDI/DIиндекс получателя или приемника (Destination Index). При реализации цепочечных операций, адресует в сегменте ES текущий элемент цепочки – получателя. При этом также осуществляется автоматический инкремент/декремент содержимого данного регистра. Может использоваться при формировании эффективных адресов.

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

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

Сегментные регистры предназначены для хранения информации о расположении соответствующих сегментов памяти в адресном пространстве.

CS – сегментный регистр кода (Code Segment Register). Содержит селектор текущего сегмента кода, т.е. сегмента, в котором размещаются исполняемые программы.

SS – сегментный регистр стека (Stack Segment Register). Содержит селектор текущего сегмента стековой памяти.

DSсегментный регистр данных (Data Segment). Содержит селектор основного текущего сегмента используемых данных.

ES, FS, GS – дополнительные сегментные регистры данных (EF – Extra Segment, EF и GS – просто обозначения). Эти регистры содержат селекторы, определяющие расположение в адресном пространстве дополнительно еще трех сегментов данных, доступных текущей программе. Специфика сегмента ES заключается в том, что только в нем размещается строка назначения (приемника) или стробирования, при обработке цепочечных команд. Дополнительные сегменты данных FS и GS, впервые появившиеся в МП 80386, не несут каких либо специфических функций и применяются только для удобства размещения данных, и их использование определяется организацией структур данных (способах размещения данных в сегментах). Отметим также, что регистры FS и GS, ни в каких командах по умолчанию не определены.

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

Кроме того, надо учитывать, что сегментный регистр кода CS является программно недоступным, и в него, отличие от всех других,  вообще нельзя занести какую либо информацию без специального приема альтернативного переименования сегментов. Начальное содержание CS устанавливается при инициализации системы и затем изменяется программно при выполнении команд межсегментных (дальних - FAR) переходов и вызовов, таких как CALL, JUMP, а также при переключении задач.

В базовом микропроцессоре i8086, а также в последующих моделях процессорах семейства Х86 в реальном режиме работы, селектором являются старшие 16 разрядов полного 20-ти разрядного адреса младшего байта соответствующего сегмента (младшие 4 разряда принимаются равными нулям).

В защищенном режиме работы процессоров семейства Х86, полный 20-ти разрядный адрес начала любого сегмента (базовый адрес) содержится в так называемом дескрипторе, некоторой 8-ми байтовой структуре данных, которая определяется содержимым соответствующего сегментного регистра, т.е. селектором. Для указания адреса конкретного байта внутри сегмента к базовому адресу прибавляется смещение (offset), которое указывается непосредственно в команде. Если  сегмент не указывается, то по умолчанию используется сегмент в соответствии с таблицей II.1.

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

- Для цепочек – получателей в цепочечных командах применяется всегда только сегмент ES.

- Получатель включения в стек или извлечения из стека находится всегда только в сегменте SS.

- Выборка команд производится всегда только из сегмента CS.

                                                                                     Таблица II.1.

Возможности переопределения сегментных регистров

Тип обращения к памяти

Базовый адрес сегмента

Сегментное смещение

По умолчанию

Возможность переопределения

Выборка команды

CS

Нет

IP(EIP)

Обращение к стеку

SS

Нет

SP(ESP)

Адресация операнда

DS

CS, SS, ES, FS, GS

EA

Адресация операнда с использованием BP(EBP) или SP(ESP) как базового регистра

SS

CS, DS, ES, FS, GS

EA

Адресация элемента цепочки-источника

DS

CS, SS, ES, FS, GS

SI(ESI)

Адресация элемента цепочки-получателя (приемника)

ES

Нет

DI(EDI)

                         Регистр указателя инструкций.

Регистр указателя инструкций EIP/IP (Instruction Pointer) предназначен для адресации команд внутри текущего сегмента кода. То есть, в этом регистре содержится смещение в сегменте кода. Программист должен полагать, что к окончанию выборки из памяти текущей команды в регистре EIP/IP образуется адрес следующей по порядку команды. Однако надо иметь в виду, что  с учетом внутренней конвейерной архитектуры современных процессоров, а также опережающей выборки команд из оперативной памяти, ситуация с адресацией команд обстоит несколько сложнее.