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 index 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) применяется в командах передачи управления. Заданное в коде команды смещение суммируется с содержимым регистра номера команды, который в это время хранит адрес следующей команды программы. В этом случае смещение интерпретируется как число со знаком длиной в один байт, слово или двойное слово и, таким образом, адрес может оказаться больше или меньше адреса текущей команды.
