ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 6738
Скачиваний: 8
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 и ОРС — дополнительные
регистры. Они будут описаны ниже.
Пример реализации микроархитектуры 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. Поскольку все адреса управляющей
памяти, которые соответствуют кодам операций, зарезервированы, то все микро-
команды, идущие после первой микрокоманды в каждой последовательности, долж-
ны размещаться в промежутках между зарезервированными адресами. По этой
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
Пример реализации микроархитектуры
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
= адрес локальной переменной, которую
нужно записать в стек
продолжение^
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 на чтение новой
вершины стека
Копирование второго слова из стека в регистр Н