Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
51
Добавлен:
21.05.2015
Размер:
83.97 Кб
Скачать

6

Лекция 12

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

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

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

Второй метод состоит в неявном определении одного или нескольких операндов. В частности, один из операндов можно использовать для записи результата. Сам операнд при этом теряется, поэтому при необходимости должен быть предварительно сохранен. По статистике такая система оказывается оправданной. Так в Pentium II, например, используются двухадресные команды, в то время как в UltraSPARC II - трехадресные. Существовали и одноадресные системы команд, в которых одним из операндов всегда должен быть фиксированный регистр - аккумулятор. Такие системы не получили развития, т.к. требовали большого количества пересылок данных. Наконец, имеются стековые машины (JVM), большинство команд которых не содержат адресов операндов.

5.1.6.1. Обзор методов адресации

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

  • непосредственная;

  • прямая;

  • регистровая;

  • косвенно-регистровая;

  • индексная;

  • относительная индексная;

  • стековая.

Рассмотрим кратко каждый из этих методов.

При непосредственной адресации в команде вместо адреса содержится сам операнд. В этом случае не требуется дополнительного обращения к памяти для выборки операнда. Однако у такого метода есть и недостатки: таким образом можно работать только с константами, количество значений ограничено размером поля. Тем не менее данная технология используется во многих архитектурах для обращения к целочисленным константам.

Прямая адресация подразумевает указание в команде полного адреса операнда. Как и предыдущий метод, пря­мая адресация имеет ограничение: команда всегда будет иметь доступ к одному адресу памяти. Таким образом, прямая адресация может использоваться лишь для доступа к глобальным переменным, адреса которых известны во время компиля­ции. Многие программы содержат глобальные переменные, поэтому этот способ широко используется.

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

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

Обращение к ячейке памяти по адресу в регистре и константе смещения называется индексной адресацией. Например, в реализации машины JVM при доступе к локальной переменной используется указатель памяти в регистре (LV) плюс небольшое смещение в самой команде. Возможно и обратное применение: указатель ячейки памяти в команде и небольшое смещение в регистре. Оба варианта часто используются для эффективной реализации алгоритмов.

В некоторых машинах применяется метод адресации, при котором адрес вычисляется путем суммирования значений двух регистров и смещения (смещение необязательно). Такой подход называется относительной индексной адресацией. Один из регистров обычно играет роль базы, другой - индекса. Этот метод еще более повышает гибкость предыдущего.

Как видно на примере JVM, стековая адресация позволяет существенно упростить систему команд. Кроме того, применение стека эффективно решает целый ряд задач из классической теории алгоритмов.

В заключение отметим, что перечисленные методы адресации охватывают не только команды, оперирующие данными, но и разнообразные команды переходов.

При рассмотрении конкретных систем команд возникает вопрос об ортогональности кодов операций и методов адресации. Такая ортогональность означает возможность более или менее свободного использования различных методов адресации независимо от конкретных команд.

Соседние файлы в папке Архитектура ЭВМ