Э. Таненбаум - Архитектура компьютера (1127755), страница 75
Текст из файла (страница 75)
Чтобы определить адрес для считывания, нужно прибавить смещение, которое хранится в регистре МВК (это буферный регистр памяти), к содержимому регистра 1Л'. Доступ к регистрам МВК и 1Л' можно получить только через шину В, поэтому сначала значение 1Лт копируется в регистр Н (в цикле 1) оаб1), а затем прибавляется значение МВК. Результат суммирования копируется в регистр МАК, и начинается процесс чтения (в цикле 1) оаб2). ЧЧ(ОЕ Переый бейт второй байт (ОхС4) (Ох16) индекса индекса Рис. 4.14. Команда П.ОАО с однобайтным индексом (а); команда ЧЧ)ОЕ П.ОАО с двухбайтным индексом (б) Пример реализации микроархитектуры 301 Однако здесь регистр МВК используется не совсем так, как в команде 61РО5Н, где байт расширен по знаку.
В случае с индексом смещение всегда положительно, поэтому байт смещения должен быть целым числом без знака (в отличие от 01РОЗН, где байт представляет собой 8-разрядное целое число со знаком). Интерфейс между регистром МВК и шиной В разработан таким образом, чтобы были возможны обе операции. В случае с командой 81РО5Н (где байт — 8-рззрядное целое число со знаком) самый левый бит значения МВК копируется в 24 старших бита шины В. В случае с командой П ОАО (где байт — 8-разрядное целое число без знака) 24 старших бита шины В заполняются нулями. Два специальных сигнала помогают определить, какую из этих двух операций нужно выполнить (см.
Рис. 4.5). В микропрограмме слово МВК указывает на байт со знаком (как в команде ЕйрозНЗ), а МВК(3 — на байт без знака (как в команде Лоаб2). Пока ожидается поступление операнда из памяти (во время 11оабЗ), значение регистра 8Р увеличивается на 1 для записи новой вершины стека. Это значение также копируется в регистр МАК (это требуется для записи операнда в стек). Затем значение РС снова увеличивается на 1, чтобы вызвать следующий код операции (микрокоманда 11оа44). Наконец, значение МТ)К копируется в регистр ТО5, чтобы показать новое верхнее слово стека (микрокоманда Лоа45). Команда 15ТОйЕ противоположна команде 1ЕОА0 (из стека выталкивается верхнее слово и сохраняется в ячейке памяти, адрес которой равен сумме значения регистра 1Л' и индекса данной команды).
В данном случае используется такой же формат, как и в команде 1ЕОЮ (см. рис. 4.14, а), только здесь код операции равен не Ох15, а Ох36. Поскольку верхнее слово стека уже известно (оно находится в регистре ТО5), его можно сразу сохранить в памяти. Однако новое верхнее слово стека все же необходимо вызвать из памяти, поэтому требуются и чтение, и запись, хотя эти операции можно выполнять в любом порядке (или даже одновременно, если бы это было возможно). Команды 1ЕОА0 и 15ТОйЕ имеют доступ только к первым 256 локальным переменным.
Хотя для большинства программ этого пространства достаточно, все же нужно иметь возможность обращаться к любой локальной переменной, в какой бы части фрейма она ни находилась. Чтобы обеспечить такую возможность, (1Ъ'М использует то же средство, что и )'х'М, — специальный код операции Н10Е (так называемый префиксный байт), за которым следует код операции 1ЫАО или 15ТОйЕ. Когда встречается такая последовательность, формат команды П.ОЮ или 15ТОЙЕ меняется; в соответствии с новым форматом за кодом операции следует не 8-разрядный, а 16-разрядный индекс, как показано на рис.
4.14, б. Команда Н10Е декодируется обычным способом. Сначала происходит переход к микрокоманде и14е1, которая обрабатывает код операции команды Н10Е. Хотя код операции, который нужно расширить, уже присутствует в регистре МВК, микрокоманда кц4е1 вызывает первый байт после кода операции, поскольку этого требует логика микропрограммы. Затем совершается еще один межуровневый переход, но на этот раз для перехода используется байт, следующий за Н10Е. Однако, поскольку команда Н10Е П.ОАО требует иного, чем 1ЕОА0, набора микрокоманд, команда Ы10Е 15ТОНŠ— иного, чем 15ТОйЕ, и т. д., при межуровневом переходе код операции нельзя использовать в качестве целевого адреса. 302 Глава 4. Уровень микроархитектуры Вместо этого микрокоманда итое1 подвергает логическому сложению адрес Ох100 и код операции, поместив его в регистр МРС. В результате интерпретация И10Е ЫАО начинается с адреса Ох115 (а не Ох15), интерпретация И10Е 1ЗТОкŠ— с адреса Ох136 (а не Ох36) и т.
д. Таким образом, каждый код операции И10Е начинается с адреса, который в управляющей памяти на 256 (то есть Ох100) слов выше, чем соответствующий код обычной операции. Начальная последовательность микрокоманд для 11.0АО и И10Е И.ОАО показана на рис. 4.15. Адрес УпРавплющал памЯть Порядок выполнения микрокоманд УУ10Е 110АО 1ЕОАО 3 1 1 Рис. 4.1 В. Начало последовательности микрокоманд для команд 1ьОАО и ЧЛОЕ 1ЕОАО. Адреса приводятся в качестве примера Команда И10Е 1ЕОАО отличается от обычной команды 1ЫАО только тем, что индекс в ней состоит из двух индексных байтов.
Слияние и последующее суммирование этих байтов должно происходить поэтапно, при этом сначала первый индексный байт сдвигается влево на 8 бит и копируется в Н. Поскольку индекс— целое число без знака, здесь используется регистр МВВ() (24 старших бита заполняются нулями). Затем прибавляется второй байт индекса (операция сложения идентична слиянию, поскольку младший байт регистра Н в данный момент равен 0), при этом гарантируется, что между байтами не будет переноса. Результат снова сохраняется в регистре Н.
С этого момента происходят те же действия, что и в стандартной команде 11.ОАО. Вместо того чтобы дублировать последние микрокоманды (от т1оабЗ до т1оа45) команды 1ЕОАО, мы просто совершили переход от итбе т1оа44 к тцоаоЗ. Отметим, что во время выполнения этой команды значение РС должно увеличиваться на 1 дважды, чтобы в конце этот регистр указывал на следующий код операции. Команда П.ОАО увеличивает значение один раз; последовательность команд И10Е 1ЕОАО также увеличивает это значение один раз.
Пример реализации микроархитектуры 303 Такая же ситуация имеет место при выполнении Ы10Е 15ТОйЕ. После первых четырех микрокоманд (от кббе )зтоге1 до кббе 1зтоге4) последовательность действий та же, что и в команде 15ТОйЕ после первых двух микрокоманд, поэтому мы совершаем переход от и)бе 1зсоге4 к 1згогеЗ. Далее мы рассмотрим команду СОС М. Есть два отличия этой команды от 1СОАО. Во-первых, она содержит 16-разрядное смещение без знака (как и расширенная версия 1СОАО), во-вторых, эта команда индексируется из регистра СРР, а не из 1Л~, поскольку она считывает значение из набора констант, а не из фрейма локальных переменных.
(Существует еще и краткая форма этой команды — СОС, но мы не стали включать ее в машину 11'х'М, поскольку полная форма содержит в себе все варианты краткой формы, хотя при этом занимает 3 байта вместо 2.) Команда 1!МС вЂ” единственная команда, помимо 15ТОЙЕ, которая может изменять локальную переменную. Она включает в себя два операнда по одному байту, как показано на рис. 4.16. Рис. 4.16.
Команда ВЫС содержит двв поля операндов Поле индекса нужно для того, чтобы определить смещение от начала фрейма локальных переменных. Команда считывает эту переменную, увеличивает ее на константу (константа содержится во втором поле) и помещает результат обратно в ту же ячейку памяти. Отметим, что константа является 8-разрядным числом со знаком в промежутке от -128 до +127.
Машина ЗУМ поддерживает расширенную версию этой команды, в которой длина каждого операнда составляет 2 байта. Рассмотрим первую команду перехода — ЮТО. Эта команда изменяет значение регистра РС таким образом, чтобы следующая 1)Ъ'М-команда находилась в ячейке памяти с адресом, который вычисляется путем прибавления 16-разрядного смещения (со знаком) к адресу кода операции ЮТО. Сложность здесь в том, что смещение связано со значением, находящимся в регистре РС в начале декодирования команды, а не тем, которое содержится в том же регистре после вызова 2 байт смещения. Чтобы лучше это понять, посмотрите на рис. 4.17, а. Здесь показана ситуация, которая имеет место в начале цикла Ма1п1.
Код операции уже находится в регистре МВК, но значение РС еще не увеличилось. На рис. 4.17, б мы видим ситуацию в начале цикла досо1. В данном случае значение РС уже увеличено на 1, а первый байт смещения уже передан в МВК. В следующей микрокоманде (рнс. 4.17, в) прежнее значение РС, которое указывает на код операции, сохраняется в регистре ОРС. Это значение требуется сохранять, поскольку именно от него, а не от текущего значения РС зависит смещение команды 6ОТО.
И именно для этого предназначен регистр ОРС. Микрокоманда досо2 начинает вызов второго байта смещения, что приводит к ситуации, показанной на рис. 4.17, г (мнкрокоманда дойоЗ). После того как первый байт смещения сдвигается влево на 8 бит и копируется в регистр Н, мы переходим к микрокоманде досо4 (рис. 4.17, д). Теперь у нас первый байт смещения, сдвинутый влево, находится в регистре Н, второй байт смещения — в реги- 304 Глава 4. Уровень микроархитектуры стре МВК, а основание смещения — в регистре ОРС. В микрокоманде дособ путем прибавления полного 16-разрядного смещения к основанию смещения мы получаем новый адрес, который помещается в регистр РС.