Э. Таненбаум - Архитектура компьютера (1127755), страница 74
Текст из файла (страница 74)
Регистр МВК (Мешогу Вцггег Ке1рзсег— буферный регистр памяти) — это однобайтный регистр, который содержит байты потока команд, поступаюших из памяти для интерпретации. ТОК и ОРС— дополнительные регистры. Они описываются далее. В определенные моменты в каждом из этих регистров обязательно находится определенное значение. Однако каждый из них в случае необходимости может также использоваться в качестве временного. В начале и конце каждой команды регистр ТОЯ (Тор 01 Бгаск — вершина стека) содержит значение адреса памяти, на который указывает ЯР. Это значение избыточно, поскольку его всегда можно считать из памяти,но если хранить это значение в регистре, то обращение к памяти не потребуется.
Для некоторых команд использование регистра ТОК,напротив, влечет за собой большее количество обращений к памяти. Например, команда РОР отбрасывает верхнее слово стека и, следовательно, должна вызвать новое значение вершины стека из памяти и записать его в регистр ТОК. ОРС вЂ” временный регистр. У него нет определенного назначения. В нем, например, может храниться адрес кода операции для команды перехода, пока значение РС увеличивается, чтобы получить доступ к параметрам. Он также используется в качестве временного регистра в командах условного перехода. Как и все интерпретаторы, микропрограмма, приведенная в табл.
4.3, включает в себя основной цикл, который вызывает, декодирует и выполняет команды интерпретируемой программы (в данном случае 11ЧМ-команды). Основной цикл начинается со строки Иа1п1, а именно — с инварнанта (утверждения), что в регистр РС уже загружен адрес ячейки памяти, в которой содержится код операции. Более того, этот код операции уже вызван из памяти в регистр МВК. Когда мы вернемся к этой ячейке, мы должны быть уверены, что значение РС уже обновлено и указывает на код следующей операции, а сам код операции уже вызван из памяти в МВК. Такая последовательность действий имеет место в начале каждой команды, поэтому важно сделать ее как можно более короткой.
Разрабатывая аппаратное и программное обеспечение микроархитектуры М(с-1, мы смогли сократить основной цикл до одной микрокоманды. Каждый раз, когда выполняется эта микрокоманда, код выполняемой операции уже находится в регистре МВК. Эта микроко- 298 Глава 4. Уровень микроархитектуры манда, во-первых, осуществляет переход к микрокоду, выполняющему данную операцию, во-вторых, вызывает следующий после кода операции байт, который может быть либо операндом, либо кодом операции. Теперь мы можем объяснить главную причину того, почему в каждой микрокоманде явным образом указывается следующая микрокоманда, а последовательность команд может не соответствовать порядку их расположения в памяти. Все адреса управляющей памяти, соответствующие кодам операций, должны быть зарезервированы для первого слова интерпретатора соответствующей команды.
Так, из табл. 4.2 мы видим, что программа, которая интерпретирует команду РОР, начинается в ячейке Ох57, а программа, которая интерпретирует команду 00Р, начинается в ячейке Ох59. (Как язык МАЕ узнает, что команду РОР нужно поместить в ячейку Ох57 — одна из загадок Вселенной. Предположительно, где-то существует файл, который сообщает ему об этом.) К сожалению, программа, интерпретирующая команду РОР, включает в себя три микрокоманды, поэтому если их расположить в памяти последовательно, то эта программа смешается с началом команды 00Р. Поскольку все адреса управляющей памяти, которые соответствуют кодам операций, зарезервированы, то все микрокоманды, идущие после первой микрокоманды в каждой последовательности, должны размещаться в промежутках между зарезервированными адресами.
По этой причине происходит очень много «скачков», и было бы нерационально каждый раз вставлять микрокоманду перехода, чтобы перейти от одной последовательности адресов к другой. Чтобы понять, как работает интерпретатор, предположим, что регистр МВВ содержит значение Ох60, то есть код операции 1Я00 (см. табл. 4.2). В основном цикле, который состоит из одной микрокоманды, выполняется следующее: 1. Значение регистра РС увеличивается, после чего он содержит адрес первого байта после кода операции. 2. Начинается передача следующего байта в регистр МВВ. Этот байт понадобится рано или поздно либо в качестве операнда текущей 1)'х'М-команды, либо в качестве кода следующей операции (как в случае с командой 1А00, у которой нет операндов). 3.
Совершается переход к адресу, который содержался в регистре МВК в начале цикла Ма1л1. Номер адреса равен значению кода операции, которая выполняется в данный момент. Этот адрес помещается туда предыдущей микрокомандой. Отметим, что значение, которое вызывается из памяти во время этой микрокоманды, не играет никакой роли в межуровневом переходе. Здесь начинается вызов следующего байта, поэтому он будет доступен уже к концу третьей микрокоманды. Хотя в тот момент указанный байт может быть не нужен, в любом случае когда-нибудь он понадобится, поэтому не будет никакого вреда в том, что вызов происходит именно здесь.
Если все разряды байта в регистре МВК равны О (это код операции для команды МОР), то следующей будет микрокоманда пор1, которая вызывается из ячейки О. Поскольку эта команда не производит никаких операций, она просто совершает переход к началу основного цикла, где повторяется та же последовательность действий, но уже с новым кодом операции в МВВ.
Пример реализации микроархитектуры 299 Еще раз подчеркнем, что микрокоманды, приведенные в табл. 4.3, расположены в памяти не последовательно, а микрокоманда Ма1п1 вовсе не находится в ячейке с адресом О (поскольку в этой ячейке должна находиться микрокоманда пор1). Задача микроассемблера — поместить каждую команду в подходящую ячейку и связать их в короткие последовательности, использовав поле ЫЕХТ А1)1ЖЕЯБ. Каждая последовательность начинается с адреса, который соответствует численному значению кода операции (например, команда РОР начинается с адреса Ох57), но остальные части последовательности могут находиться в любых ячейках управляющей памяти, и эти ячейки не обязательно смежные.
А теперь рассмотрим команду 1А00. Она начинается с микрокоманды 1а661. Требуется выполнить следующие действия: 1. Значение регистра ТОЯ уже есть, но из памяти нужно вызвать второе слово стека. 2. Значение регистра ТОЯ нужно прибавить ко второму слову стека, вызванному из памяти. 3. Результат, который помещается в стек, должен быть сохранен в памяти и в регистре ТОК. Для того чтобы вызвать операнд из памяти, необходимо уменьшить значение указателя стека и записать его в регистр МАК. Отметим, что этот адрес будет использоваться для последующей записи.
Более того, поскольку эта ячейка памяти станет новой вершиной стека, данное значение должно быть присвоено регистру ЗР. Следовательно, определить новое значение ЯР и МАК, уменьшить значение БР на 1 и записать его в оба регистра можно за одну операцию. Все этн действия выполняются в первом цикле (1а661). Здесь же инициируется операция чтения.
Кроме того, регистр МРС получает значение из поля ЫЕХТ А111ЖЕБЗ микрокоманды 1а661. Это адрес микрокоманды 1а662. Затем За662 считывается из управляющей памяти. Во втором цикле, пока происходит считывание операнда из памяти, мы копируем верхнее слово стека из ТОЗ в Н, где оно будет доступно для сложения, когда процесс считывания завершится. В начале третьего цикла (1а663) М1Ж содержит второе слагаемое, вызванное из памяти. В этом цикле оно прибавляется к значению регистра Н, а результат сохраняется обратно в регистрах М1Ж и ТОК. Кроме того, начинается операция записи, в процессе которой новое верхнее слово стека сохраняется в памяти.
В этом цикле команда поЬо приписывает адрес Иазп1 регистру МРС, и таким образом мы возвращаемся к исходному пункту, и можем начать выполнение следующей операции. Если следующий код 1)ЧМ-операции, который содержится в данный момент в регистре МВК, равен Ох64 (150В), то повторяется практически та же последовательность действий. После выполнения Ма1п1 управление передается микрокоманде с адресом Охб4 (1зцЬ1). За этой микрокомандой следуют 1зцЬ2, 1зцЬЗ, а затем снова Иа1п1. Единственное различие между этой и предыдущей последовательностями состоит в том, что в цикле ЗэцЬЗ содержимое регистра Н не прибавляется к значению М1Ж, а вычитается из него.
Команда 1АМ0 идентична командам 1А00 и 15ОВ, только в данном случае два верхних слова стека подвергаются логическому умножению (операция И), а не 300 Глава 4. Уровень микроархитектуры складываются и не вычитаются. Нечто подобное происходит и во время выполнения команды 10К Если код операции соответствует команде 00Р, РОР или 5))АР, то нужно использовать стек. Команда 00Р дублирует верхнее слово стека.
Поскольку значение этого слова уже находится в регистре ТОК, нужно просто увеличить 5Р на 1. После этого регистр 5Р будет указывать на новый адрес. В эту новую ячейку и записывается значение регистра ТО5. Команда РОР тоже достаточно проста: нужно только уменьшить значение ЯР на 1, чтобы отбросить верхнее слово стека. Однако после этого необходимо считать новое верхнее слово стека из памяти и записать его в регистр ТОК. Наконец, команда 5)(АР меняет местами значения двух ячеек памяти, а именно — два верхних слова стека.
Регистр ТОК уже содержит одно из этих значений, поэтому считывать его (значение) из памяти не нужно. Подробнее мы обсудим эту команду немного позже. Команда 01Р05Н сложнее предыдущих, поскольку за кодом операции следует байт, как показано на рис. 4.13. Этот байт представляет собой целое число со знаком.
Указанный байт, который был передан в регистр МВК во время выполнения микрокоманды Ма1П1, нужно расширить до 32 бит (знаковое расширение) и скопировать его в регистр М?Ж. Затем значение ЯР увеличивается на 1 и копируется в МАК, что позволяет записать операнд на вершину стека.
Этот операнд также должен копироваться в регистр ТОК. Отметим, что значение регистра РС требуется увеличить на 1, чтобы в микрокоманде Иа(п1 имелся код следующей операции. Рис. 4.13. Формат команды В)РОЯН Теперь рассмотрим команду П ОА0. В этой команде за кодом операции также следует байт (рис. 4.14, а), но этот байт представляет собой индекс (без знака), используемый для того, чтобы найти в пространстве локальных переменных слово, которое нужно поместить в стек. Поскольку здесь имеется всего 1 байт, доступно только 2з = 256 слов, а именно первые 256 слов пространства локальных переменных. Для выполнения команды 100А0 требуются и чтение (чтобы вызвать слово), и запись (чтобы поместить его в стек).