Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 20. Особенности архитектуры IA-32-64.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
255 Кб
Скачать
☆

20.5. Способы адресации

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

Рис. 20.8. Формирование линейного адреса в процессоре с архитектурой IA-32/64

Сегмент оперативной памяти, с ко­торым работает программа, определяется кодом в регистре сегмента. В архитектуре предусмотрено шесть регистров сегментов, один из которых в зависимости от текущего контекста используется для формирования адреса при выполнении очередной команды. В каждом регистре сегмента хранится начальный адрес соответствующего сегмента. С каждым регистром сегмен­та, доступным для программы, связан регистр дескриптора сегмента (он со стороны программы недоступен), в котором хранится информация о правах доступа к сегменту, его начальный адрес и длина. Кроме того, имеется еще два регистра, которые могут быть использованы при формировании исполнительного адреса — регистр базы и индексный регистр.

В таблице 20.1 перечислены режимы адресации, которые поддерживаются в процессорах с архитектурой IA-32/64.

В режиме непосредственной адресации (Immediate mode) значение операнда включается в код команды. Операнд может иметь формат байта, слова или двойного слова.

В режиме регистровой адресации (register operand mode) операнд размеща­ется в каком-либо регистре общего назначения (R0-R15).

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

Таблица 20.1. Режимы адресации

Способ адресации

Алгоритм

Непосредственная

O=A

Регистровая

ИA=R

Со смещением

ИA=(SR) + A

Базовая

ИA=(SR) + (R)

Базовая со смещением

ИA=(SR) + (R) +A

Масштабируемая индексная со смещением

ИA=(SR) + (R)*S + A

Базовая с индексированием и смещением

ИA=(SR) + (Ri) + (Rk) + A

Базовая с масштабируемым индексированием и смещением

ИA=(SR) + (Ri)*S + (Rk) +A

Относительная

ИA= (РНК) + A

Условные обозначения:

ИA — исполнительный адрес;

О – непосредственный операнд;

(X) — содержимое ячейки X;

(SR) — содержимое регистра сегмента;

А — содержимое адресного поля команды;

Ri — регистр общего назначения;

S — коэффициент масштабирования.

В режиме адресации со смещением (displacement mode) ад­рес операнда (смещение относительно начального адреса сегмента) содержится в коде команды в виде 8-, 16- или 32-разрядного значения. В режиме сегментации оперативной памяти все адреса в командах несут информацию о смещении внутри сегмента. Режим адресации со смещением в чистом виде используется в немногих моделях процессоров, поскольку поддержка этого режима требует увеличения длины команды. Этот режим полезно использовать при обращении к глобальным переменным в программе.

Остальные режимы адресации — косвенные, т.е. они всегда указывают ядру процессора, где искать адрес операнда. В режиме базовой адре­сации (base mode) указывается один из регистров общего назначения, в кото­ром содержится адрес. Фактически это тот же самый режим, который ранее назывался косвенным через регистр.

В базовом режиме со смещением (base with displacement mode) в коде ко­манды имеется смещение, которое добавляется к содержимому регистра базы. В качестве последнего может быть задан любой регистр общего назначения.

В масштабируемом индексном режиме адресации со смещением (scaled in­dex with displacement mode) значение смещения из адресного поля команды складывается с содержимым регистра, который в этом режиме является индекс­ным. В качестве индексного может быть задан любой из регистров общего на­значения, кроме регистра RSP. Регистр ESP предназначен, в основ­ном, для работы со стеком. При вычислении адреса содержи­мое индексного регистра умножается на коэффициент, который может быть равен 1, 2, 4 или 8, а полученное произведение суммируется со значением сме­щения. Этот режим очень подходит для индексирования элементов массивов. Коэффициент 2 можно использовать при работе с массивом 16-разрядных целых чисел, коэффициент 4 — при работе с массивом 32-разрядных чисел или чисел в формате с плавающей точкой обычной точности, а коэффициент 8 — при работе с числами в формате с плавающей точкой двойной точности.

В базовом режиме адресации с индексированием и смещением (base with index and displacement mode) при формировании адреса сумми­руются содержимое индексного регистра, регистра базы и адресного поля коман­ды, в котором задается смещение. Как и в предыдущем режиме, в качестве реги­стра базы можно использовать любой регистр общего назначения процессора, а в качестве индексного регистра — любой, кроме RSP. С помощью такого режима адресации весьма удобно программировать в процедуре обработку элементов локального массива, размещенного в кадре стека. Он применяется и при обработке двухмерных массивов. В этом варианте смещение задает начальный адрес двухмерного массива, а в каждом из регистров задается величина, пропорцио­нальная индексу по одной из размерностей.

В базовом режиме адресации с масштабируемым индексированием и сме­щением (base with Index and displacement mode) адрес формиру­ется в результате суммирования содержимого индексного регистра, умноженного на коэффициент масштабирования, регистра базы и адресного поля команды, в котором задается смещение. При обработке локальных массивов, размещенных в кадре стека, элементы которых занимают 2, 4 или 8 байт, приращение индекс­ного регистра на 1 сразу дает адрес очередного элемента. То же самое относится и к обработке двухмерных массивов с элементами такого формата.

Относительная адресация (relative mode) применяется в командах передачи управления. Заданное в коде команды смещение суммируется с содержимым регистра номера команды, который в это время хранит адрес следующей команды программы. В этом случае смещение интер­претируется как число со знаком длиной в один байт, слово или двойное слово и, таким образом, адрес может оказаться больше или меньше адре­са текущей команды.