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

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

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

Добавлен: 24.12.2021

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

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

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

Адресация

  3 7 3

Таблица 5.6.

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

польской записи

Шаг Оставшаяся цепочка Команда Стек

1

2
3
4
5
6
7
8
9

10
11
12
13

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

х+132х+4-/

+132Х+4-/

132х+4-/

32х+4-/
2х+4-/
х

 + 4-/

+

 4-/

4 - /

- /

/

BIPUSH

 8

BIPUSH 2
BIPUSH 5
IMUL
IADD
BIPUSH 1
BIPUSH 3
BIPUSH 2
IMUL
IADD
BIPUSH 4
ISUB
IDIV

8
8,2
8,2,5
8,10

18
18,1
18,1,3
18,1,3,2
18,1,6
18,7
18,7,4
18,3

6

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

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

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

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

Рассмотрим 32-битные форматы команд для трехадресной машины (рис. 5.16).

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

Неиспользованное 6-битное поле в конце формата может использоваться для

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

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

Необходимо также иметь небольшое число дополнительных команд (напри-

мер, команды условных переходов), но они легко подходят под формат 3. Напри-
мер, можно приписать один код операции каждому (условному) переходу, вызову

процедуры и т. д., тогда останется 24 бита для смещения по счетчику команд. Если
предположить, что это смещение считается в словах, период будет составлять
± 32 Мбайт. Несколько кодов операций можно зарезервировать для команд LOAD


background image

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 к


background image

Адресация 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, и в качестве одного из
операндов считывает слово из полученного адреса памяти. Значение регистра ЕВХ

не изменяется.


background image

3 7 6

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

Таблица 5.7.

 32-битные способы адресации процессора Pentium II.

М[х] — это слово в памяти с адресом х

MOD

R/M 00 01 10 11

000
001
010
011

100
101

110
111

М[ЕАХ]
М[ЕСХ]
M[EDX]
М[ЕВХ]

SIB
Прямая
адресация
M[ESI]
M[EDI]

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

SIB и СМЕЩЕНИЕ 8

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

M[ESI+CMEU4EHME8]
M[EDI+CMEU4EHHE 8]

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

SIB и СМЕЩЕНИЕ 32

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

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

ЕАХ или AL
ЕСХ или CL
EDX или DL
ЕВХ или BL
ESP или АН
ЕВР или СН

ESI или DH
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] за одну команду.

А стоит ли применять такой способ адресации? На этот вопрос трудно отве-

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

Мы представили несколько возможных компромиссов, с которыми постоянно

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


background image

Адресация

377

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

Стековый

фрейм

Другие

локальные

переменные

а[0]

а [2]

ЕВР

ЕВР + 8

ЕВР + 12

ЕВР+16

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

Значения SIB

М

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

Рис.

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

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

В архитектуре команд процессора UltraSPARC все команды используют непо-

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

ких и подобных команд никакие другие способы адресации не используются.

К памяти обращаются команды трех типов: команды загрузки (LOAD), команды

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

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

У машины JVM нет общих способов адресации в том смысле, что каждая коман-

да содержит несколько битов, которые сообщают, как нужно вычислить адрес (как

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