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

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

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

Добавлен: 24.12.2021

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

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

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

258 Глава 4. Микроархитектурный уровень

Чтобы микроассемблер установил бит JAMZ, нужно написать следующее:

if(Z) goto LI, else goto L2

Поскольку аппаратное обеспечение требует, чтобы 8 младших битов этих адре-

сов совпадали, задача микроассемблера состоит в том, чтобы присвоить им такие
адреса. С другой стороны,

 L2

 может находиться в любом из младших 256 слов

управляющей памяти, поэтому микроассемблер без труда найдет подходящую пару.

Часто эти два утверждения сочетаются. Например,

Z=TOS. if(Z) goto LI. else goto L2

В результате такой записи MAL породит микрокоманду, в которой значение

регистра TOS пропускается через АЛУ, но при этом нигде не сохраняется, так что
это значение устанавливает бит Z. Сразу после загрузки из АЛУ бит Z соединяется
со старшим битом регистра МРС через схему ИЛИ, вследствие чего адрес следую-
щей микрокоманды будет вызван или из

 L2,

 или из

 Ы.

 Значение регистра МРС ста-

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

Наконец, нам нужна специальная запись, чтобы использовать бит JMPC:

goto (MBR OR value)

Эта запись сообщает микроассемблеру, что нужно использовать

 value

 (значе-

ние) для поля NEXT^ADDRESS и установить бит JMPC, так чтобы MBR соеди-

нялся через схему ИЛИ с регистром МРС вместе со значением NEXT_ADDRESS.
Если

 value

 равно 0, достаточно написать:

goto (MBR)

Отметим, что только 8 младших битов регистра MBR соединяются с регистром

МРС (см. рис. 4.5), поэтому вопрос о знаковом расширении тут не возникает. Так-

же отметим, что используется то значение MBR, которое доступно в конце теку-
щего цикла.

Реализация IJVM с использованием Mic-1

Сейчас мы уже дошли до того момента, когда можно соединить все части вместе.
В табл. 4.4-приводится микропрограмма, которая работает на микроархитектуре
Mic-1 и интерпретирует IJVM. Программа очень короткая — всего 112 микроко-

манд. Таблица состоит из трех столбцов. В первом столбце записано символичес-

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

тельно соответствует последовательности адресов в управляющей памяти.

Выбор названий большинства регистров, изображенных на рис. 4.1, должен стать

очевидным. Регистры СРР (Constant Pool Pointer — указатель набора констант),

LV (Local Variable pointer — указатель фрейма локальных переменных) и SP (Stack

Pointer — указатель стека) содержат указатели адресов набора констант, фрейма

локальных переменных и верхнего элемента в стеке соответственно, а регистр PC

(Program Counter — счетчик команд) содержит адрес байта, который нужно вызвать
следующим из потока команд. Регистр MBR (Memory Buffer Register — буферный
регистр памяти) — это 1-байтовый регистр, который содержит байты потока ко-
манд, поступающих из памяти для интерпретации. TOS и ОРС — дополнительные

регистры. Они будут описаны ниже.


background image

Пример реализации микроархитектуры 259

В определенные моменты в каждом из этих регистров обязательно находится

определенное значение. Однако каждый из них также может использоваться в каче-

стве временного регистра в случае необходимости. В начале и конце каждой коман-

ды регистр TOS (Top Of Stack register — регистр вершины стека) содержит значе-

ние адреса памяти, на который указывает SP. Это значение избыточно, поскольку
его всегда можно считать из памяти, но если хранить это значение в регистре, то
обращение к памяти не требуется. Для некоторых команд использование регистра
TOS, напротив, влечет за собой

 больше

 обращений к памяти. Например, команда

POP отбрасывает верхнее слово стека и, следовательно, должна вызвать новое зна-

чение вершины стека из памяти и записать его в регистр TOS.

ОРС — временный регистр. У него нет определенного заданного назначения.

В нем, например, может храниться адрес кода операции для команды перехода,

пока значение PC увеличивается, чтобы получить доступ к параметрам. Он также

используется в качестве временного регистра в командах условного перехода.

Как и все интерпретаторы, микропрограмма, приведенная в табл.

 АЛ,

 включает

в себя основной цикл, который вызывает, декодирует и выполняет команды ин-
терпретируемой программы (в данном случае команды IJVM). Основной цикл

начинается со строки Mainl, а именно с инварианта (утверждения), что в регистр

PC уже загружен адрес ячейки памяти, в которой содержится код операции. Более

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

Такая последовательность действий имеет место в начале каждой команды,

поэтому важно сделать ее как можно более короткой. Разрабатывая аппаратное и
программное обеспечение микроархитектуры Mic-1, мы смогли сократить основ-

ной цикл до одной микрокоманды. Каждый раз, когда выполняется эта микроко-

манда, код операции, которую нужно выполнить, уже находится в регистре MBR.

Эта микрокоманда, во-первых, осуществляет переход к микрокоду, который вы-

полняет данную операцию, а во-вторых, вызывает следующий после кода опера-

ции байт, который может быть либо операндом, либо кодом операции.

А теперь мы можем объяснить главную причину, почему в каждой микроко-

манде явным образом указывается следующая микрокоманда и почему последо-
вательность команд может и не соответствовать порядку их расположения в памя-

ти. Все адреса управляющей памяти, соответствующие кодам операций, должны

быть зарезервированы для первого слова интерпретатора соответствующей коман-

ды. Так, из табл. 4.2 мы видим, что программа, которая интерпретирует команду

POP, начинается в ячейке 0x57, а программа, которая интерпретирует команду DUP,

начинается в ячейке 0x59. (Как язык MAL узнает, что команду POP нужно помес-

тить в ячейку 0x57, — одна из загадок Вселенной. Предположительно, где-то суще-
ствует файл, который сообщает ему об этом.)

К сожалению, программа, интерпретирующая команду POP, включает в себя три

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

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

ны размещаться в промежутках между зарезервированными адресами. По этой


background image

260 Глава 4. Микроархитектурный уровень

причине происходит очень много «скачков», и было бы нерационально каждый
раз вставлять микрокоманду перехода, чтобы перепрыгнуть от одной последова-

тельности адресов к другой.

Чтобы понять, как работает интерпретатор, предположим, что регистр MBR

содержит значение 0x60, то есть код операции IADO (см. табл. 4.2). В основном цик-

ле, который состоит из одной микрокоманды, выполняется следующее:

1. Значение регистра PC увеличивается, и теперь он содержит адрес первого

байта после кода операции.

2. Начинается передача следующего байта в регистр MBR. Этот байт пона-

добится рано или поздно либо в качестве операнда текущей команды IJVM,
либо в качестве кода следующей операции (как в случае с командой IADD, у
которой нет операндов).

3. Совершается переход к адресу, который содержался в регистре MBR в нача-

ле цикла Main 1. Номер адреса равен значению кода операции, которая вы-

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

Здесь начинается вызов следующего байта, поэтому он будет доступен уже к концу

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

Таблица 4.4.

 Микропрограмма для Mic-1

Микрокоманда Операции Комментарий

Maini PC=PC+1; fetch; goto(MBR) MBR содержит код операции; получение

следующего байта; отсылка

Ничего не происходит

Чтение слова, идущего после верхнего слова стека

Н = вершина стека

Суммирование двух верхних слов; запись

суммы в верхнюю позицию стека

Чтение слова, идущего после верхнего слова стека
Н = вершина стека

Вычитание; запись результата в вершину стека

Чтение слова, идущего после верхнего слова стека

Н = вершина стека

Операция И; запись результата в вершину стека

Чтение слова, идущего после верхнего слова

Н = вершина стека
Операция ИЛИ; запись результата в вершину стека

Увеличение SP на 1 и копирование результата

в регистр MAR

пор!
iaddi
iadd2
iadd3

isubi

isub2
isub3

iandi
iand2
iand3

ior1
стека
ior2

ior3

duol

goto Maini
MAR=SP=SP-1;rd

H=TOS
MDR=TOS=MDR+H;wr;

goto Main 1

MAR=SP=SP-1.rd

H=TOS

MDR=TOS=MDR-H;wr;

goto Maini

MAR=SP=SP-1;rd
H=TOS

MDR=TOS=MDRHH,wr;
goto Maini
MAR=SP=SP-1;rd

H=TOS

М0Р=ТО5=МОРИЛИН;

wr;goto Maini

MAR=SP=SP+1


background image

Пример реализации микроархитектуры

261

Микрокоманда Операции

Комментарий

dup2

рор1
рор2

рорЗ
swapi

swap2

swap3

swap4
swap5

swap6
bipushi

bipush2

bipush3

iloadi

iload2

iload3

iload4

iload5

istore 1

istore2

istore3

istore4
istore5

istore6

widei

widejloadi

wide_iload2

wide_iload3
wide_iload4

MDR=TOS; wr; goto Maini

MAR=SP=SP-1;rd

TOS^MDR; goto Maini

MAR=SP=SP-1;rd

MAR=SP

H=MDR;

 wr

MDR=TOS
MAR=SP-1;wr

TOS-H; goto Maini
SP=MAR=SP+1

PC=PC+1; fetch

MDR=TOS=MBR;wr;

goto Maini

H=LV

MAR=MBRU+H;rd

MAR=SP=SP+1

PC=PC+1; fetch; wr

TOS=MDR;gotoMam1

H=LV

MAR=MBRU+H

MDR=TOS; wr

SP=MAR=SP-1;rd
PC=PC+1; fetch

TOS=MDR; goto Main 1

PC=PC+1;fetch,

goto(MBR ИЛИ 0x100)

PC=PC+1;fetch

H=MBRU«8

н=мвриилин

MAR=LV+H; rd;

goto iload3

Запись нового слова в стек

Чтение слова, идущего после верхнего слова стека
Программа ждет, пока считается из памяти новое

значение регистра TOS

Копирование нового слова в регистр TOS

Установка регистра MAR на значение SP-1;
чтение второго слова из стека
Установка регистра MAR на верхнее слово стека
Сохранение значения TOS в регистре Н; запись
второго слова в вершину стека

Копирование прежнего значения TOS в регистр MDR

Установка регистра MAR на значение SP-1;
запись второго слова в стек

Обновление TOS
MBR = байт, который нужно поместить в стек

Увеличение PC на 1; вызов кода следующей
операции

Добавление к байту дополнительного знакового

разряда и запись значения в стек

MBR содержит индекс; копирование значения

L V B H

MAR = адрес локальной переменной, которую
нужно поместить в стек
Регистр SP указывает на новую вершину стека;
подготовка к записи

Увеличение значения PC на 1, вызов кода
следующей операции, запись вершины стека
Обновление TOS

MBR содержит индекс; копирование значения

L V B H

MAR = адрес локальной переменной, в которую
нужно сохранить слово из стека
Копирование значения TOS в регистр

 MDR;

запись слова

Чтение из стека второго слова сверху

Увеличение PC на 1; вызов следующего кода
операции

Обновление TOS
Межуровневый переход к старшим адресам

MBR содержит первый байт индекса; вызов
второго байта
Н = первый байт индекса, сдвинутый влево на 8 битов
Н = 16-битный индекс локальной переменной

MAR

 = адрес локальной переменной, которую

нужно записать в стек

продолжение^


background image

262

Глава 4. Микроархитектурный уровень

Таблица 4.4

 (продолжение)

Микрокоманда Операции

Комментарий

widejstorei

wide_istore2

wide_istore3

wide_istore4

Idc_w1

Idc_w2

Idc_w3

Idc_w4

iincl

iinc2

iinc3

iinc4

iinc5

iinc6

gotoi

goto2

goto3

goto4
goto5

goto6

if It 1

iflt2

iflt3

mt4

ifeqi

ifeq2

ifeq3

ifeq4

ifjcmpeqi

if_icmpeq2

if icmpeq3

PC=PC+1; fetch

H=MBRU«8

H=MBRU ИЛИ Н
MAR=LV+H; rd; goto istore3

PC=PC+1;fetch

H=MBRU«8

н^мвииилин

MAR=H+CPP; rd;

goto iload3

H=LV

MAR=MBRU+H;rd

PC=PC+1; fetch

H=MDR

PC=PC+1; fetch

MDR=MBR+H;wr,

goto Maini
OPC=PC-1

PC=PC+1; fetch

H=MBR«8

H=MBRU ИЛИ Н

PC=OPC+H; fetch

goto Maini

MAR=SP=SP-1;rd

OPC=TOS

TOS=MDR

N=OPC; if(N) goto T;
else goto F
MAR=SP=SP~1;rd
OPC=TOS

TOS=MDR

ZOPC;if(Z)gotoT;
else goto F

MAR=SP=SP-1;rd
MAR=SP=SP-1

H=MDR; rd

MBR содержит первый байт индекса; вызов

второго байта

Н = первый байт индекса, сдвинутый влево
на 8 битов

Н = 16-битный индекс локальной переменной

MAR = адрес локальной переменной, в которую

нужно записать слово из стека

MBR содержит первый байт индекса; вызов

второго байта
Н = первый байт индекса, сдвинутый влево

на 8 битов

Н = 16-битный индекс константы в наборе констант

MAR = адрес константы в наборе констант

MBR содержит индекс; копирование значения

L V B H

Копирование суммы значения LV и индекса

в регистр MAR; чтение переменной
Вызов константы
Копирование переменной в регистр Н
Вызов следующего кода операции

Запись суммы в регистр MDR; обновление
переменной

Сохранение адреса кода операции

MBR = первый байт смещения; вызов второго
байта
Сдвиг первого байта влево на 8 битов
и сохранение его в регистре Н
Н =16-битное смещение перехода
Суммирование смещения и ОРС

Ожидание вызова следующего кода операции

Чтение второго сверху слова в стеке
Временное сохранение TOS в ОРС
Запись новой вершины стека в TOS
Переход в бит N

Чтение второго сверху слова е стеке

Временное сохранение TOS в ОРС

Запись новой вершины стека в TOS

Переход в бит Z

Чтение второго сверху слова в стеке

Установка регистра MAR на чтение новой

вершины стека

Копирование второго слова из стека в регистр Н