Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура компьютера - Э.Таненбаум

.pdf
Скачиваний:
131
Добавлен:
24.05.2014
Размер:
5.64 Mб
Скачать

Адресация

3 7 3

Таблица 5.6. Использование стека для вычисления формулы в обратной польской записи

Шаг

Оставшаяся цепочка

Команда

Стек

1

8 2 5 х + 1 3 2 х + 4 - /

BIPUSH 8

8

2

25х+132х+4-/

BIPUSH2

8,2

3

5х+132х+4-/

BIPUSH5

8,2,5

4

х+132х+4-/

IMUL

8,10

5

+132Х+4-/

IADD

18

6

132х+4-/

BIPUSH 1

18,1

7

32х+4-/

BIPUSH3

18,1,3

8

2х+4-/

BIPUSH 2

18,1,3,2

9

х + 4-/

IMUL

18,1,6

10

+ 4-/

IADD

18,7

11

4 - /

BIPUSH 4

18,7,4

12

- /

ISUB

18,3

13

/

IDIV

6

Ортогональность кодов операций

испособов адресации

Сточки зрения программного обеспечения, команды и способы адресации должны иметь регулярную структуру, число форматов команд должно быть минимальным. При такой структуре компилятору гораздо проще порождать нужный код. Все коды операций должны допускать все способы адресации, где это имеет смысл. Более того, все регистры должны быть доступны для всех типов регистров (включая указатель фрейма (FP), указатель стека (SP) и программный счетчик (PC)).

Рассмотрим 32-битные форматы команд для трехадресной машины (рис. 5.16). Здесь поддерживаются до 256 кодов операций. В формате 1 каждая команда имеет два входных регистра и один выходной регистр. Этот формат используется для всех арифметических и логических команд.

Неиспользованное 6-битное поле в конце формата может использоваться для дальнейшей дифференциации команд. Например, можно иметь один код для всех операций с плавающей точкой, а различаться эти операции будут по дополнительному полю. Кроме того, если установлен бит 23, тогда используется формат 2, а второй операнд уже не является регистром, а является 13-битной непосредственной константой со знаком. Команды LOAD и STORE тоже могут использовать этот формат для обращения к памяти при индексном способе адресации.

Необходимо также иметь небольшое число дополнительных команд (например, команды условных переходов), но они легко подходят под формат 3. Например, можно приписать один код операции каждому (условному) переходу, вызову процедуры и т. д., тогда останется 24 бита для смещения по счетчику команд. Если предположить, что это смещение считается в словах, период будет составлять

± 32 Мбайт. Несколько кодов операций можно зарезервировать для команд LOAD

374 Глава 5. Уровень архитектуры команд

и STORE, которым нужны длинные смещения из формата 3. Они не будут общими (например, только регистр R0 будет загружаться и сохраняться), и использоваться будут довольно редко.

Биты

Код операции

 

Выходной

Входной

Входной

 

регистр

регистр 1

регистр 1

 

 

Код операции

1

Выходной

Входной

Смещение

регистр

регистр 1

 

 

 

Код операции

 

 

Смещение

Рис. 5.16. Разработкаформатов команддлятрехадресной машины

Теперь рассмотрим разработку для двухадресной машины, в которой в качестве любого операнда может использоваться слово из памяти (рис. 5.17). Такая машина может прибавлять слово из памяти к регистру, прибавлять регистр к слову из памяти, складывать два регистра или складывать два слова из памяти. В настоящее время осуществлять доступ к памяти довольно дорого, поэтому данный проект не очень популярен, но если с развитием технологий доступ к памяти в будущем станет дешевле, такой подход будет считаться простым и эффективным. Машины PDP-11 и VAX были очень популярны и доминировали на рынке мини-компью- теров в течение двух десятилетий. В этих машинах использовались форматы, сходные с тем, который изображен на рис. 5.17.

Биты

8

3

5

4

3

5

4

| Код операции I

Состояние Т

Регистр

[СмещениеТСостояние]

Регистр

I Смещение

 

 

Факультативный32-битныйадресилисмещение

 

 

 

Факультативный32-битныйадресилисмещение

 

 

Рис.5.17.Разработкаформатовкоманддлядвухадресноймашины

Здесь мы снова имеем 8-битный код операции, но теперь у нас есть 12 битов для определения источника и 12 битов для определения пункта назначения. Для каждого операнда 3 бита дают метод адресации, 5 битов дают регистр и 4 бита дают смещение. Имея 3 бита для установления метода адресации, мы можем поддерживать непосредственную, прямую, регистровую, косвенную регистровую индексную и стековую адресации, и при этом еще остается место для двух дополнительных методов, которые, возможно, появятся в будущем. Это простая разработка, которую легко компилировать; онадостаточно гибкая, особенно если счетчик программ, указатель стека и указатель локальных переменных находятся среди регистров общего назначения, к которым можно получить доступ.

Единственная проблема, которая здесь есть, — это то, что при прямой адресации нам нужно большее количество битов для адреса. В машинах PDP-11 и VAX к

Адресация 375

команде было добавлено дополнительное слово для адреса каждого прямо адресуемого операнда. Мы тоже могли бы использовать один из двух доступных способов адресации для индексной адресации с 32-битным смещением, которое следует за командой. Тогда в худшем случае при прибавлении слова из памяти к слову из памяти, когда обращение к обоим операндам производится с помощью прямой адресации, или при использовании длинной индексной формы команда была бы 96 битов в длину и занимала бы 3 цикла шины (один — для команды и два — для данных). С другой стороны, большинству разработок типа RISC потребовалось бы по крайней мере 96 битов, а может и больше, для прибавления произвольного слова из памяти к другому произвольному слову из памяти, и тогда нужно было бы по крайней мере 4 цикла шины.

Помимо форматов, изображенных на рис. 5.17, возможны и другие варианты.

Вданной разработке можно выполнять операцию

спомощью одной 32-битной команды, при условии что i HJ находятся среди первых 16 локальных переменных. Для переменных после 16 нам приходится переходить к 32-битным смещениям. Можно сделать другой формат с одним 8-битным смещением вместо двух 4-битных и правилом, что это смещение может использоваться либо источником, либо пунктом назначения, но не тем и другим одновременно. Варианты компромиссов не ограничены, и разработчикидолжны учитывать многие факторы, чтобы получить хороший результат.

Способы адресации процессора Pentium II

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

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

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

3 7 6 Глава 5. Уровень архитектуры команд

Таблица 5.7. 32-битные способы адресации процессора Pentium II. М[х] — это слово в памяти с адресом х

 

MOD

 

 

 

R/M

00

01

10

11

000

М[ЕАХ]

М[ЕАХ+СМЕЩЕНИЕ 8]

М[ЕАХ+СМЕЩЕНИЕ32]

ЕАХ или AL

001

М[ЕСХ]

М[ЕСХ+СМЕЩЕНИЕ 8]

М[ЕСХ+СМЕЩЕНИЕ32]

ЕСХ или CL

010

M[EDX]

MtEDX+СМЕЩЕНИЕ 8]

М[ЕОХ+СМЕЩЕНИЕ32]

EDX или DL

011

М[ЕВХ]

М[ЕВХ+СМЕЩЕНИЕ8]

М[ЕВХ+СМЕЩЕНИЕ32]

ЕВХ или BL

100

SIB

SIB и СМЕЩЕНИЕ 8

SIB и СМЕЩЕНИЕ 32

ESP или АН

101

Прямая

М[ЕВР+СМЕЩЕНИЕ8]

М[ЕВР+СМЕЩЕНИЕ32]

ЕВР или СН

 

адресация

 

 

 

110

M[ESI]

M[ESI+CMEU4EHME8]

М[ЕЭ1+СМЕЩЕНИЕ32]

ESI или DH

111

M[EDI]

M[EDI+CMEU4EHHE 8]

MtEDI+СМЕЩЕНИЕ32]

EDI или ВН

При MOD=11 предоставляется выбор из двух регистров. Для команд со словами берется первый вариант, для команд с байтами — второй. Отметим, что здесь не все регулярно. Например, нельзя осуществить косвенную адресацию через ЕВР или прибавить смещение к ESP.

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

Форматы SIB могут пригодиться для обращения к элементам массива. Рассмотрим следующее выражение на языке Java:

for (i=0; i<n; i++) a[i]=0;

где а — это массив 4-байтных целых чисел, относящийся к текущей процедуре. Обычно регистр ЕВР используется для указания на базу стекового фрейма, который содержит локальные переменные и массивы, как показано на рис. 5.18. Компилятор должен хранить i в регистре ЕАХ. Для доступа к элементу a[i] он будет использовать формат SIB, в котором адрес операнда равен сумме 4хЕАХ, ЕВР и 8. Эта команда может сохраняться в a[i] за одну команду.

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

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

Адресация 377

иметь представление о том, какова рабочая нагрузка. Можно быть уверенным, что разработчики машины 8088 не включили web-браузер в набор тестов. Решения, принятые 20 лет назад, могут оказаться абсолютно неудачными с точки зрения современных приложений. Однако если какая-либо особенность была включена в машину, избавиться от нее уже невозможно по причине требования совместимости.

 

 

ЕВР

 

 

Другие

 

i в регистре ЕАХ

 

локальные

 

 

 

переменные

 

Значения SIB

Стековый

 

 

а[0]

ЕВР + 8

М [4*ЕАХ+ЕВР+8]

фрейм

 

 

 

 

 

ЕВР + 12

 

 

а [2]

ЕВР+16

 

Рис. 5.18. Обращение кэлементу массива a[i]

Способы адресации процессора UltraSPARC II

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

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

Способы адресации машины JVM

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

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-Х, но поскольку операция отрицания очень часто применяется, в архитектуру