Таненбаум Э.- Архитектура компьютера. стр.210

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

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

3. Совершается переход к адресу, который содержался в регистре MBR в начале цикла Mai ni. Номер адреса равен значению кода операции, которая выполняется в данный момент. Этот адрес помещается туда предыдущей микрокомандой. Отметим, что значение, которое вызывается из памяти во время этой микрокоманды, не играет никакой роли в межуровневом переходе.

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

Если все разряды байта в регистре MBR равны 0 (это код операции для команды NOP), то следующей будет микрокоманда nopl, которая вызывается из ячейки 0. Поскольку эта команда не производит никаких операций, она просто совершает переход к началу основного цикла, где повторяется та же последовательность действий, но уже с новым кодом операции в MBR.

Еще раз подчеркнем, что микрокоманды, приведенные в табл. 4.3, расположены в памяти не последовательно, а микрокоманда Mai ni вовсе не находится в ячейке с адресом 0 (поскольку в этой ячейке должна находиться микрокоманда nopl). Задача микроассемблера — поместить каждую команду в подходящую ячейку и связать их в короткие последовательности, использовав поле NEXT_ADDRESS. Каждая последовательность начинается с адреса, который соответствует численному значению кода операции (например, команда POP начинается с адреса 0x57), но остальные части последовательности могут находиться в любых ячейках управляющей памяти, и эти ячейки не обязательно смежные.

А теперь рассмотрим команду IADD. Она начинается с микрокоманды iaddl. Требуется выполнить следующие действия:

1. Значение регистра TOS уже есть, но из памяти нужно вызвать второе слово стека.

2. Значение регистра TOS нужно прибавить ко второму слову стека, вызванному из памяти.

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

Для того чтобы вызвать операнд из памяти, необходимо уменьшить значение указателя стека и записать его в регистр MAR. Отметим, что этот адрес будет использоваться для последующей записи. Более того, поскольку эта ячейка памяти станет новой вершиной стека, данное значение должно быть присвоено регистру SP. Следовательно, определить новое значение SP и MAR, уменьшить значение SP на 1 и записать его в оба регистра можно за одну операцию.

Все эти действия выполняются в первом цикле (iaddl). Здесь же инициируется операция чтения. Кроме того, регистр MPC получает значение из поля NEXT_ ADDRESS микрокоманды iaddl. Это адрес микрокоманды iadd2. Затем iadd2 считывается из управляющей памяти. Во втором цикле, пока происходит считывание операнда из памяти, мы копируем верхнее слово стека из TOS в Н, где оно будет доступно для сложения, когда процесс считывания завершится.


⇐ Предыдущая страница| |Следующая страница ⇒