ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 12148
Скачиваний: 10

3 7 8 Глава 5. Уровень архитектуры команд
доступный способ — индексная адресация. Она используется командами LOAD,
ISTORE, LDCW, а также несколькими командами, которые определяют переменную,
связанную с каким-нибудь неявным регистром, обычно LV или СРР. Команды
перехода тоже используют индексную адресацию, при этом PC рассматривается
как регистр.
Сравнение способов адресации
Мы только что рассмотрели несколько способов адресации. Способы адресации
машин Pentium II, UltraSPARC II и JVM изложены в табл. 5.8. Как мы уже гово-
рили, не каждый способ может использоваться любой командой.
Таблица 5.8.
Сравнение способов адресации
Способ адресации Pentium II UltraSPARC II
JVM
Непосредственная
Прямая
Регистровая
Косвенная регистровая
Индексная
Относительная индексная
Стековая
X
X
X
X
X
X
X
X
X
На практике для эффективной архитектуры команд вовсе не требуется боль-
шого количества различных способов адресации. Поскольку практически весь код,
написанный на этом уровне, будет порождаться компиляторами, способов адреса-
ции должно быть мало, и они должны быть четкими и ясными. Машина должна
предлагать либо все возможные варианты, либо только один вариант.
В остальных промежуточных случаях может оказаться так, что компилятор не
способен сделать выбор.
Поэтому самые простые архитектуры используют очень небольшое число
способов адресации, причем на каждый из этих способов накладываются жесткие
ограничения. Обычно практически для любых применений достаточно непосред-
ственной, прямой, регистровой и индексной адресации. Каждый регистр (включая
указатель локальных переменных, указатель стека и счетчик программ) должен
быть пригоден к употреблению всякий раз, когда этот регистр требуется. Более
сложные способы адресации могут сократить число команд, но при этом придется
ввести последовательности операций, которые трудно будет выполнять параллель-
но с другими последовательными операциями.
Мы рассмотрели возможные компромиссы между кодами операций и адреса-
ми и между различными способами адресации. Когда вы сталкиваетесь с новым
компьютером, вы должны изучить все команды и способы адресации не только
для того, чтобы знать, какие из них имеются в наличии, но и для того, чтобы по-
нять, почему был сделан именно такой выбор и каковы были бы последствия при
другом выборе.

Типы команд 379
Типы команд
Команды можно грубо поделить на несколько групп, которые повторяются от ма-
шины к машине, хотя и могут различаться в деталях. Кроме того, в каждом компью-
тере всегда имеется несколько необычных команд, которые добавлены в целях
совместимости с предыдущими моделями или из-за того, что у разработчика воз-
никла блестящая идея, или потому, что правительство заплатило производителю,
чтобы тот включил эту команду в набор команд. Ниже мы попытаемся описать все
наиболее распространенные категории. Отметим, что мы не претендуем на исчер-
пывающее изложение.
Команды перемещения данных
Копирование данных из одного места в другое — одна из самых распространенных
операций. Под копированием мы понимаем создание нового объекта с точно та-
ким же набором битов, как у исходного объекта. Такое понимание слова «переме-
щение» несколько отличается от его обычного значения. Если мы говорим, что
какой-то человек переместился из Нью-Йорка в Калифорнию, это не значит, что
в Калифорнии была создана идентичная копия этого человека, а оригинал остался
в Нью-Йорке. Когда мы говорим, что содержимое ячейки памяти 2000 перемести-
лось в какой-либо регистр, мы всегда подразумеваем, что там была создана иден-
тичная копия и что оригинал все еще находится в ячейке 2000. Команды переме-
щения данных лучше было бы назвать командами дублирования данных, но термин
«перемещение данных» уже устоялсч.
Есть две причины, по которым данные могут копироваться из одного места
в другое. Одна из них фундаментальна: присваивание переменным значений. Опе-
рация присваивания
А=В
выполняется путем копирования значения, которое находится в ячейке памяти
с адресом В, в ячейку А, поскольку программист приказал это сделать. Вторая
причина копирования данных — предоставить возможность быстрого обращения
к ним. Как мы уже видели, многие команды могут обращаться к переменным только
в том случае, если они имеются в регистре. Поскольку существует два возможных
источника элемента данных (память и регистр) и существует два возможных пун-
кта назначения для элемента данных (память и регистр), следовательно, существует
4 различных способа копирования. В одних компьютерах содержится 4 команды
для 4 случаев, в других — одна команда для всех 4 случаев. Некоторые компьюте-
ры используют команду LOAD для перемещения из памяти в регистр, команду STORE —
для перемещения из регистра в память, команду MOVE — для перемещения из одно-
го регистра в другой регистр, но не имеют никакой команды для копирования из
одной части памяти в другую.
Команды перемещения данных должны как-то указывать, какое именно коли-
чество данных нужно переместить. Существуют команды для перемещения разно-
го количества данных — от одного бита до всей памяти. В машинах с фиксирован-
ной длиной слова обычно перемещается ровно одно слово. Любые перемещения
другого количества данных (больше слова или меньше слова) должны выполнять-

3 8 0 Глава 5. Уровень архитектуры команд
ся программным обеспечением с использованием сдвигов и слияний. Некоторые
архитектуры команд дают возможность копировать отрезки данных размером мень-
ше слова (они обычно измеряются в байтах), а также сразу несколько слов. Копи-
рование нескольких слов рискованно, особенно если максимальное количество слов
достаточно большое, поскольку такая операция может занять много времени и,
возможно, ее придется прерывать в середине. Некоторые машины с изменяемой
длиной слов содержат команды, которые определяют только адреса источника и
места назначения, но не количество данных. Перемещение продолжается до тех
пор, пока не появится специальное поле конца данных.
Бинарные операции
Бинарные операции — это такие операции, которые берут два операнда и получа-
ют из них результат. Все архитектуры команд содержат команды для сложения и
вычитания целых чисел. Команды умножения и деления целых чисел также име-
ются практически во всех случаях. Думаю, нет необходимости объяснять, почему
компьютеры оснащены арифметическими командами.
Следующая группа бинарных операций содержит булевы команды. Существу-
ет 16 булевых функций от двух переменных, но есть очень немного машин, в кото-
рых имеются команды для всех 16. Обычно присутствуют И, ИЛИ и НЕ; иногда
кроме них еще есть ИСКЛЮЧАЮЩЕЕ ИЛИ, НЕ-ИЛИ и НЕ-И.
Важным применением команды И является выделение битов из слов. Рас-
смотрим машину со словами длиной 32 бита, в которой на одно слово приходится
четыре 8-битных символа. Предположим, что нужно отделить второй символ от
остальных трех, чтобы его напечатать. Это значит, что нужно создать слово, кото-
рое содержит этот символ в правых 8 битах с нулями в левых 24 битах (так называ-
емое
выравнивание по правому биту).
Чтобы извлечь нужный нам символ, слово, содержащее этот символ, соединя-
ется операцией И с константой, которая называется
маской.
В результате этой
операции все ненужные биты меняются на нули:
10110111 10111100 11011011 10001011 А
00000000 11111111 00000000 00000000 В (маска)
00000000 10111100 00000000 00000000 А И В
Затем результат сдвигается на 16 битов вправо, чтобы нужный символ нахо-
дился в правом конце слова.
Важным применением команды ИЛИ является помещение битов в слово. Эта
операция обратна операции извлечения. Чтобы изменить правые 8 битов 32-битно-
го слова, не повредив при этом остальные 24 бита, сначала нежелательные 8 битов
надо заменить на нули, а затем новый символ соединить операцией ИЛИ с полу-
ченным результатом, как показано ниже:
10110111 10111100 11011011 10001011 А
11111111 11111111 11111111 00000000 В (маска)
10110111 10111100 ПОПОИ 00000000 АИ В
00000000 00000000 00000000 01010111 С
10110111 10111100 ПОПОИ 01010111 (АИВ) ИЛИ С

Типы команд 381
Операция И убирает единицы, и в полученном результате никогда не бывает
больше единиц, чем в любом из двух операндов. Операция ИЛИ вставляет едини-
цы, и поэтому в полученном результате всегда по крайней мере столько же еди-
ниц, сколько в операнде с большим количеством единиц. Команда ИСКЛЮЧАЮ-
ЩЕЕ ИЛИ, в отличие от них, симметрична в отношении единиц и нулей. Такая
симметрия иногда может быть полезной, например при порождении случайных
чисел.
Большинство компьютеров сегодня поддерживают команды с плавающей точ-
кой, которые в основном соответствуют арифметическим операциям с целыми числа-
ми. Большинство машин содержит по крайней мере 2 варианта таких чисел: более
короткие для скорости и более длинные на тот случай, если требуется высокая точ-
ность вычислений. Существует множество возможных форматов для чисел с плава-
ющей точкой, но сейчас практически везде применяется единый стандарт IEEE 754.
Числа с плавающей точкой и этот стандарт обсуждаются в приложении Б.
Унарные операции
Унарные операции используют один операнд и производят один результат. По-
скольку в данном случае нужно определять на один адрес меньше, чем в бинарных
операциях, команды иногда бывают короче, хотя часто требуется определять дру-
гую информацию.
Команды для сдвига и циклического сдвига очень полезны. Они часто даются
в нескольких вариантах. Сдвиги — это операции, при которых биты сдвигаются
налево или направо, при этом биты, которые сдвигаются за пределы слова, утрачи-
ваются. Циклические сдвиги — это сдвиги, при которых биты, вытесненные с од-
ного конца, появляются на другом конце. Разница между обычным сдвигом и цик-
лическим сдвигом показана ниже:
00000000 00000000 00000000 01110011 А
00000000 00000000 00000000 00011100 сдвиг вправо на 2 бита
11000000 00000000 00000000 00011100 циклический сдвиг вправо на 2 бита
Обычные и циклические сдвиги влево и вправо очень важны. Если п-битное
слово циклически сдвигается влево на к битов, результат будет такой же, как при
циклическом сдвиге вправо на n-k битов.
Сдвиги вправо часто выполняются с расширением по знаку. Это значит, что
позиции, освободившиеся на левом конце слова, заполняются изначальным зна-
ковым битом (0 или 1), как будто знаковый бит перетащили направо. Кроме того,
это значит, что отрицательное число останется отрицательным. Ниже показаны
сдвиги на 2 бита вправо:
1111111 11111111 11111111 11110000А
0011111 11111111 11111111 11111100 А сдвинуто без знакового расширения
1111111 11111111 11111111 11111100 А сдвинуто со знаковым расширением
Операция сдвига используется при умножении и делении на 2. Если положи-
тельное целое число сдвигается влево на к битов, результатом будет изначальное
число, умноженное на 2
к
. Если положительное целое число сдвигается вправо на
к битов, результатом будет изначальное число, деленное на 2
к
.

3 8 2 Глава 5. Уровень архитектуры команд
Сдвиги могут использоваться для повышения скорости выполнения некото-
рых арифметических операций. Рассмотрим выражение 18хп, где п — положитель-
ное целое число. 18xn=16xn+2xn. 16xn можно получить путем сдвига копии п на
4 бита влево. 2хп можно получить, сдвинув п на 1 бит влево. Сумма этих двух
чисел равна 18хп. Таким образом, это произведение можно вычислить путем од-
ного перемещения, двух сдвигов и одного сложения, что обычно гораздо быстрее,
чем сама операция умножения. Конечно, компилятор может применять такую
схему, только если один из множителей является константой.
Сдвиг отрицательных чисел даже со знаковым расширением дает совершенно
другие результаты. Рассмотрим, например, число -1 в обратном двоичном коде.
При сдвиге влево на 1 бит получается число -3. При сдвиге влево еще на 1 бит
получается число -7:
11111111 11111111 11111111 11111110 число-1 в обратном двоичном коде
11111111 11111111 11111111 11111100 число-1 сдвигается влево на 1 бит (-3)
11111111 11111111 11111111 11111000 число-1 сдвигается влево на2бита(-7)
Сдвиг влево отрицательных чисел в обратном двоичном коде не умножает чис-
ло на 2. Однако сдвиг вправо производит деление корректно.
А теперь рассмотрим число -1 в дополнительном двоичном коде. При сдвиге
вправо на 6 бит с расширением по знаку получается число - 1 , что неверно, по-
скольку целая часть от -1/64 равна 0:
11111111 11111111 11111111 11111111 число -1 в дополнительном двоичном
коде
11111111 11111111 11111111 11111111 число-1, сдвинутое влево на 6 битов,
равно -1
Как мы видим, сдвиг вправо вызывает ошибки. Однако при сдвиге влево число
умножается на 2.
Операции циклического сдвига нужны для манипулирования последователь-
ностями битов в словах. Если нужно проверить все биты в слове, при циклическом
сдвиге слова последовательно по 1 биту каждый бит помещается в знаковый бит,
где его можно легко проверить, а когда все биты проверены, можно восстановить
изначальное значение слова. Операции циклического сдвига гораздо удобнее опе-
раций обычного сдвига, поскольку при этом не теряется информация: произволь-
ная операция циклического сдвига может быть отменена другой операцией цик-
лического сдвига.
В некоторых бинарных операциях очень часто используются совершенно опре-
деленные операнды, поэтому в архитектуры команд часто включаются унарные
операции для их быстрого выполнения. Например, перемещение нуля в память
или регистр чрезвычайно часто выполняется при начале вычислений. Перемеще-
ние нуля — это особый случай команды перемещения данных. Поэтому для повы-
шения производительности часто вводится операция CLR с единственным адресом
той ячейки, которую нужно очистить (то есть установить на 0).
Прибавление 1 к слову тоже часто используется при различных подсчетах. Унар-
ная форма команды ADD — это операция INC, которая прибавляет 1. Другой при-
мер — операция NEG. Отрицание X — это на самом деле бинарная операция вычита-
ния 0-Х, но поскольку операция отрицания очень часто применяется, в архитектуру