- •Глава 14. Способы адресации операндов
- •15.1. Непосредственная адресация (операнд в команде)
- •15.2. Прямая адресация
- •15.3. Регистровая адресация
- •15.4. Косвенная адресация
- •15.5. Косвенная адресация через память
- •15.6. Косвенная регистровая адресация
- •15.7. Индексная и базовая адресации
- •15.8. Индексная адресация
- •15.9. Относительная адресация
- •15.10. Контрольные вопросы
15.8. Индексная адресация
Индексная адресация предоставляет удобный механизм для организации итеративных вычислений. Пусть, например, имеется массив чисел, расположенных в оперативной памяти последовательно, начиная с адреса N, и необходимо увеличить на единицу все элементы данного массива. Для этого требуется извлечь каждое число из оперативной памяти, прибавить к нему 1 и вернуть обратно, а последовательность адресов будет следующей: N, N+ 1, N+ 2 и т. д., вплоть до последней ячейки, занимаемой рассматриваемым массивом. Начальный адрес массива заносится в регистр общего назначения, а в поле «смещение» - шаг по массиву. Возможен вариант, когда и начальный адрес массива, и шаг по массиву заносятся в два регистра общего назначения, а поле «смещение» не используется. После очередного цикла содержимое регистра общего назначения с адресом массива увеличивается на величину шага (смещения или содержимого другого регистра общего назначения).
Так как это довольно типичный случай, во многих архитектурах компьютеров увеличение или уменьшение содержимого регистра с адресом массива до или после обращения к нему осуществляется автоматически, как часть машинного цикла. Такой прием называется автоиндексированием. Если для индексной адресации используются специально выделенные регистры, автоиндексирование может производиться неявно и автоматически. При использовании для хранения адресов массивов регистров общего назначения необходимость операции автоиндексирования должна указываться в команде специальным разрядом.
Автоиндексирование с увеличением содержимого регистра носит название автоинкрементной адресации.
Если увеличение содержимого регистра происходит после формирования адреса, этот способ называется постинкрементным автоиндексированием.
Если сначала производится увеличение содержимого регистра, и уже новое значение используется для формирования адреса, то говорят о преинкрементном автоиндексировании.
Автоиндексирование с уменьшением содержимого индексного регистра носит название автодекрементной адресации.
Здесь также возможны два варианта, отличающиеся последовательностью выполнения операций уменьшения содержимого индексного регистра и вычисления адреса: постдекрементное автоиндексирование и предекрементное автоиндексирование.
15.9. Относительная адресация
Для команд безусловного и условного перехода (ветвления) наиболее типична относительная адресация, когда в адресной части команды указывается смещение адреса точки перехода относительно текущей команды, то есть смещение относительно текущего содержимого регистра номера команды. Использование данного способа адресации позволяет программе выполняться в любом месте оперативной памяти — программы становятся перемещаемыми. Среди команд безусловного перехода доля относительной адресации составляет около 90%.
Для команд перехода чрезвычайно важно, насколько далеко адрес перехода отстоит от адреса команды перехода, иными словами, какова типичная величина смещения. Часто длина смещения не превышает 8 разрядов, что соответствует смещению в пределах ±128 относительно команды ветвления.
При относительной адресации для получения исполнительного адреса операнда содержимое поля «смещение» команды складывается с содержимым регистра номера команды (рис. 15.7).
Рис. 15.7. Относительная адресация
Следует отметить, что в момент вычисления исполнительного адреса операнда в регистре номера команды уже может быть сформирован адрес следующей команды, что нужно учитывать при выборе величины смещения. Обычно поле «смещение» трактуется как двоичное число в дополнительном коде.
Адресация относительно регистра номера команды базируется на свойстве локальности, выражающемся в том, что большая часть обращений происходит к ячейкам, расположенным в непосредственной близости от выполняемой команды. Это позволяет сэкономить на длине адресной части команды, поскольку разрядность поля «смещение» может быть небольшой. Главное достоинство данного способа адресации состоит в том, что он делает программу перемещаемой в оперативной памяти. Независимо от текущего расположения программы в адресном пространстве взаимное положение команды и операнда остается неизменным, поэтому адресация операнда остается корректной.
Во всех рассмотренных способах адресации предполагалось, что формируется исполнительный адрес операнда, результата операции или перехода. Если в компьютере не предусмотрена виртуальная память, то сформированный адрес является физическим адресом оперативной памяти. Если же в компьютере реализована виртуальная память, то необходимо виртуальный адрес преобразовать в физический.
