ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 14.01.2021

Просмотров: 140

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

6


Лекция 12


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


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

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

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


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


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

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

  • прямая;

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

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

  • индексная;

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

  • стековая.


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

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


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

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

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

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

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

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

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

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


5.1.6.2. Методы адресации Pentium II


Методы адресации процессора Pentium II нерегулярны и зависят от того, в каком формате используется конкретная команда - 16- или 32-бит­ном. В данном разделе мы кратко рассмотрим в этом плане лишь 32-битные команды. Поддерживаемые здесь методы включают непосредственную, прямую, регистровую, косвенно-регистровую, индексную и специальную адресацию для обращения к элементам массива. Неортогональность методов адресации кодам операций существенно усложняет труд разработчиков компиляторов.


Как было видно ранее из обзора форматов команд, методами адресации управляет байт MODE (“состояние”). Один из операндов всегда является регистром и определяется по значению поля REG. Другой операнд команды задается комбинацией полей MOD и R/M. В следующей таблице приведен список 32 комбинаций значений 2-битного поля MOD и 3-битного поля R/M. Например, если оба поля равны 0, операнд считывается из ячейки памяти с адресом, который содержится в регистре ЕАХ.


R/M

MOD = 00

01

10

11

000

M[EAX]

M[EAX + Смещение 8]

M[EAX + Смещение 32]

EAX или AL

001

M[ECX]

M[ECX + Смещение 8]

M[ECX + Смещение 32]

ECX или CL

010

M[EDX]

M[EDX + Смещение 8]

M[EDX + Смещение 32]

EDX или DL

011

M[EBX]

M[EBX + Смещение 8]

M[EBX + Смещение 32]

EBX или BL

100

SIB

SIB и Смещение 8

SIB и Смещение 32

ESP или AH

101

Прямая

M[EBP + Смещение 8]

M[EBP + Смещение 32]

EBP или CH

110

M[ESI]

M[ESI + Смещение 8]

M[ESI + Смещение 32]

ESI или DH

111

M[EDI]

M[EDI + Смещение 8]

M[EDI + Смещение 32]

EDI или BH


Колонки 01 и 10 содержат методы адресации, при которых содержимое регистра добавляется к 8- или 32-битному смещению, содержащемуся в коман­де. Если выбрано 8-битное смещение, оно перед сложением получает 32-битное знаковое расширение. Например, команда ADD с полем R/M=011, полем MOD=01 и смещением=6, вычисляет сумму регистра ЕВХ и 6, и в качестве операнда считывает слово из полученного адреса памяти. Значение регистра ЕВХ не изменяется. При MOD = 11 имеется два варианта регистров. Для команд со слова­ми берется первый вариант, с байтами - второй.

Иногда за байтом MODE следует дополнительный байт SIB (только при 32-битной адресации), который определяет масштабный коэффициент и два регистра. При наличии байта SIB адрес операнда вычис­ляется путем умножения индексного регистра на 1, 2, 4 или 8 (в зависимости от SCALE), добавлением его к базовому регистру и, наконец, возможным добавле­нием 8- или 32-битного смещения, в зависимости от значения поля MOD. Практи­чески все регистры могут использоваться как в качестве индекса, так и в качестве базы.


5.1.6.3. Методы адресации UltraSPARC II


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

К памяти обращаются команды трех типов: загрузка (LOAD), сохранение (STORE) и одна команда синхронизации мультипроцессора. Для команд LOAD и STORE есть два способа обращения к памяти. При первом способе вычисляется сумма двух регистров, которая затем используется как адрес (можно считать это относительной индексной адресацией без смещения). Второй способ представляет собой индексный метод с 13-бит­ным смещением со знаком.



5.1.6.4. Методы адресации JVM


У машины JVM нет общих методов адресации в обычном смысле. Коман­ды не содержат поля, сообщающего способ вычисления адреса. Вместо этого здесь с каждой командой связан собственный метод адресации. Поскольку в JVM нет видимых регистров, то регистровая и косвенно-регистровая адресация здесь невозможна. Несколько команд, напри­мер BIPUSH, используют непосредственную адресацию. Единственный метод адресации через регистры - индексный. Он используется командами LOAD, ISTORE, LDCW и другими командами, которые неявно определяют переменную через регистр, обычно LV или СРР. Команды перехода тоже используют индексную адресацию, при этом в качестве регистра рассматривается PC.


5.1.7. Типы команд


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


5.1.7.1. Команды перемещения данных


Эти команды правильнее было бы назвать дублированием данных, но термин “перемещение данных” уже устоялся. Копирование данных из одного места в другое является одной из самых распространенных операций в программах.

Есть две цели, ради которых данные могут копироваться из одного места в другое. Одна из них - присваивание переменным значений, вторая - предоставить возможность быстрого обращения к ним. Многие команды могут обращаться к переменным только в том случае, если они имеются в регистре. Поскольку существуют два возможных источника и два возможных приемника элемента данных (память и регистр), то имеются 4 различных случая копирования. В одних компьютерах имеются 4 команды для 4 случаев, в других - одна команда на все 4 случая. Некоторые компьюте­ры используют команду LOAD для загрузки из памяти в регистр, команду STORE - для записи из регистра в память, команду MOVE - для копирования из регистра в регистр, но не имеют команд для копирования из одной ячейки памяти в другую.

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


5.1.7.2. Бинарные операции



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

Следующая группа бинарных операций содержит булевы команды. В математике существует много булевых операций над двумя переменными, однако обычно машины содержат лишь некоторые из них. Обычно присутствуют И, ИЛИ и НЕ; иногда кроме них еще есть ИСКЛЮЧАЮЩЕЕ ИЛИ, НЕ-ИЛИ и НЕ-И.

Важными применениями команды И являются выделение битов из слов, а также их стирание (запись 0). Команда ИЛИ часто используется для установки (записи 1) битов в слове. Команда ИСКЛЮЧАЮ­ЩЕЕ ИЛИ, симметричная в отношении единиц и нулей, может быть полезна для быстрого шифрования/дешифрования двоичной информации. Ее однократное применение шифрует операнд, повторное с той же маской – восстанавливает.

Большинство компьютеров имеет команды с плавающей точ­кой, которые соответствуют арифметическим операциям с вещественными числа­ми. Многие машины содержат по крайней мере 2 варианта таких чисел: более короткие для скорости и более длинные для высокой точ­ности вычислений. Существует множество возможных форматов для чисел с плава­ющей точкой, но сейчас практически везде применяется единый стандарт IEEE 754.


5.1.7.3. Унарные операции


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

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

Сдвиги вправо часто выполняются с расширением по знаку. Это значит, что позиции, освободившиеся на левом конце слова, заполняются изначальным зна­ковым битом (0 или 1). Это значит, что отрицательное число останется отрицательным.

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

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


Смотрите также файлы