ICQ SHOP
5-значные
6-значные
7-значные
8-значные
9-значные
Rippers List
ОПЛАТА
СТАТЬИ
СЕКРЕТЫ
HELP CENTER
OWNED LIST
РОЗЫСК!New!
ICQ РЕЛИЗЫ
Протоколы ICQ
LOL ;-)
Настройка компьютера
Аватарки
Смайлики
СОФТ
Mail Checkers
Bruteforces
ICQTeam Soft
8thWonder Soft
Other Progs
ICQ Patches
Miranda ICQ
ФорумАрхив!
ВАШ АККАУНТ
ICQ LiveJournal
РекламаНаш канал:
irc.icqinfo.ru
|
Таненбаум Э.- Архитектура компьютера. стр.224
Таненбаум Э.- Архитектура компьютера. стр.224
Чтобы продемонстрировать, как работает Mic-2, рассмотрим команду IADD. Она берет второе слово из стека и выполняет сложение как и раньше, но только сейчас ей не нужно осуществлять переход к Mai ni после завершения операции, чтобы увеличить значение PC и перейти к следующей микрокоманде. Когда блок выборки команд распознает, что в цикле iadd3 произошло обращение к регистру MBR1, его внутренний сдвиговый регистр сдвигает все вправо и перезагружает MBR1 и MBR2. Он также осуществляет переход в состояние, которое на 1 меньше текущего. Если новое состояние — это состояние 2, блок выборки команд начинает вызов слова из памяти. Все это реализуется аппаратно. Микропрограмма ничего не должна делать. Именно поэтому команду IADD можно сократить с пяти до трех микрокоманд.
Рис. 4.20. Тракт данных для Мю-2 Таблица 4.8. Микропрограмма для Мю-2
Микрокоманда
порі
|
Операции
goto (MBR)
|
Комментарий
Переход к следующей команде
|
іасІсИ
|
MAR = SP = SP - 1; rd
|
Чтение слова, идущего после верхнего слова
|
|
|
стека
|
іас!сІ2
|
H = TOS
|
Н = вершина стека
|
Микрокоманда
|
Операции
|
Комментарий
|
iadd3
|
MDR = TOS = MDR + H; wr; goto (MBR1)
|
Суммирование двух верхних слов; запись суммы в верхнюю позицию стека
|
isuM
|
MAR = SP = SP - 1; rd
|
Чтение слова, идущего после верхнего слова стека
|
isub2
|
H = TOS
|
Н = вершина стека
|
isub3
|
MDR = TOS = MDR -H; wr; goto (MBR1)
|
Вычитание TOS из вызванного значения TOS - 1
|
iandl
|
MAR = SP = SP - 1; rd
|
Чтение слова, идущего после верхнего слова стека
|
iand2
|
H = TOS
|
Н = вершина стека
|
iand3
|
MDR = TOS = MDR И H; wr; goto (MBR1)
|
Логическое умножение вызванного значения TOS - 1 и TOS (операция И)
|
iorl
|
MAR = SP = SP - 1; rd
|
Чтение слова, идущего после верхнего слова стека
|
ior2
|
H = TOS
|
Н = вершина стека
|
ior3
|
MDR = TOS = MDR ИЛИ H; wr; goto (MBR1)
|
Логическое сложение вызванного значения TOS - 1 и TOS (операция ИЛИ)
|
dupl
|
MAR = SP = SP + 1
|
Увеличение SP на 1 и копирование результата в регистр MAR
|
dup2
|
MDR = TOS; wr; goto (MBR1)
|
Запись нового слова в стек
|
popl
|
MAR = SP = SP - 1; rd
|
Чтение слова, идущего после верхнего слова стека
|
pop2
|
|
Программа ждет, пока закончится процесс чтения
|
рорЗ
|
TOS = MDR; goto (MBR1)
|
Копирование нового слова в регистр TOS
|
swapl
|
MAR = SP - 1; rd
|
Чтение второго слова из стека; установка регистра MAR на значение SP
|
swap2
|
MAR = SP
|
Подготовка к записи нового второго слова стека
|
swap3
|
H = MDR; wr
|
Сохранение нового значения TOS; запись второго слова стека
|
swap4
|
MDR = TOS
|
Копирование прежнего значения TOS в регистр MDR
|
swap5
|
MAR = SP - 1; wr
|
Запись прежнего значения TOS на второе место в стеке
|
swap6
|
TOS = H; goto (MBR1)
|
Обновление TOS
|
bipushl
|
SP = MAR = SP + 1
|
Установка регистра MAR для записи в новую вершину стека
|
bipush2
|
MDR = TOS = MBR1; wr; goto (MBR1)
|
Обновление стека в регистре TOS и памяти
|
iloadl
|
MAR = LV + MBR1U; rd
|
Перемещение значения LV с индексом в регистр MAR; чтение операнда
|
Продолжение &
Таблица 4.8 (продолжение)
|
Микрокоманда
|
Операции
|
Комментарий
|
iload2
|
MAR = SP = SP + 1
|
Увеличение SP на 1; перемещение нового значения SP в регистр MAR
|
iload3
|
TOS = MDR; wr; goto (MBR1)
|
Обновление стека в регистре TOS и памяти
|
istorel
|
MAR = LV + MBR1U
|
Установка регистра MAR на значение LV + индекс
|
istore2
|
MDR = TOS; wr
|
Копирование значения TOS для сохранения в памяти
|
istore3
|
MAR = SP = SP - 1; rd
|
Уменьшение SP на 1; чтение нового значения TOS
|
istore4
|
|
Машина ждет окончания процесса чтения
|
istoreö
|
TOS = MDR; goto (MBR1)
|
Обновление TOS
|
widel
|
goto (MBR1 ИЛИ 0x100)
|
Следующий адрес — 0x100 ИЛИ код операции
|
wide_iload1
|
MAR = LV + MBR2U; rd; goto iload2
|
То же, что iioadl, но с использованием 2-байтного индекса
|
wide_istore1
|
MAR = LV + MBR2U; goto istore2
|
То же, что istorel, но с использованием 2-байтного индекса
|
Idc_w1
|
MAR = CPP + MBR2U; rd; goto iload2
|
То же, что wide_iload1, но индексирование осуществляется из регистра СРР
|
und
|
MAR = LV + MBR1U; rd
|
Установка регистра MAR на значение LV + индекс; чтение этого значения
|
iinc2
|
H = MBR1
|
Присваивание регистру Н константы
|
iinc3
|
MDR = MDR + H; wr; goto (MBR1)
|
Увеличение на константу и обновление
|
gotol
|
H = PC - 1
|
Копирование значения PC в регистр Н
|
goto2
|
PC = H + MBR2
|
Прибавление смещения и обновление PC
|
goto3
|
|
Машина ждет, пока блок выборки команд вызовет новый код операции
|
goto4
|
goto (MBR1)
|
Переход к следующей команде
|
ifltl
|
MAR = SP = SP - 1; rd
|
Чтение второго сверху слова в стеке
|
iflt2
|
OPC = TOS
|
Временное сохранение TOS в ОРС
|
iflt3
|
TOS = MDR
|
Запись новой вершины стека в TOS
|
iflt4
|
N = OPC; if(N) goto T; eise goto F
|
Переход по биту N
|
ifeql
|
MAR = SP = SP - 1; rd
|
Чтение второго сверху слова в стеке
|
ifeq2
|
OPC = TOS
|
Временное сохранение TOS в ОРС
|
ifeq3
|
TOS = MDR
|
Запись новой вершины стека в TOS
|
ifeq4
|
Z = OPC; if(Z) goto T; eise goto F
|
Переход по биту Z
|
if_icmpeq1
|
MAR = SP = SP - 1; rd
|
Чтение второго сверху слова в стеке
|
Микрокоманда
if_icmpeq2
|
Операции
MAR = SP = SP - 1
|
Комментарий
Установка регистра MAR на чтение новой вершины стека
|
if_icmpeq3
|
H = MDR; rd
|
Копирование второго слова из стека в регистр Н
|
if_icmpeq4
|
OPC = TOS
|
Временное сохранение TOS в ОРС
|
if_icmpeq5
|
TOS = MDR
|
Помещение новой вершины стека в TOS
|
if_icmpeq6
|
Z = H - OPC; if(Z) goto T; else goto F
|
Если два верхних слова равны, осуществляется переход к Т; если они не равны, осуществляется переход к F
|
T
|
H = PC - 1; goto goto2
|
То же, что gotol
|
F
|
H = MBR2
|
Игнорирование байтов, находящихся в регистре MBR2
|
F2
|
goto (MBR1)
|
|
invoke_virtual1
|
MAR = CPP + MBR2U; rd
|
Помещение адреса указателя процедуры в регистр MAR
|
invoke_virtual2
|
OPC = PC
|
Сохранение значения PC в регистре ОРС
|
invoke_virtual3
|
PC = MDR
|
Установка PC на первый байт кода процедуры
|
invoke_virtual4
|
TOS = SP - MBR2U
|
TOS = адрес OBJREF - 1
|
invoke_virtual5
|
TOS = MAR = H = TOS + 1
|
TOS = адрес OBJREF
|
invoke_virtual6
|
MDR = SP + MBR2U + 1; wr
|
Перезапись OBJREF со связующим указателем
|
invoke_virtual7
|
MAR = SP = MDR
|
Установка регистров SP и MAR на адрес ячейки, в которой содержится старое значение PC
|
invoke_virtual8
|
MDR = OPC; wr
|
Подготовка к сохранению старого значения PC
|
invoke_virtual9
|
MAR = SP = SP + 1
|
Увеличение SP на 1; теперь SP указывает на ячейку, в которой хранится старое значение LV
|
invoke_virtual10
|
MDR = LV; wr
|
Сохранение старого значения LV
|
invoke_virtual11
|
LV = T05; goto (MBR1)
|
Установка значения LV на нулевой параметр
|
ireturnl
|
MAR = SP = LV; rd
|
Переустановка регистров SP и MAR для чтения связующего указателя
|
ireturn2
|
|
Процесс считывания связующего указателя
|
ireturn3
|
LV = MAR = MDR; rd
|
Установка регистров LV и MAR на связующий указатель; чтение старого значения PC
|
ireturn4
|
MAR = LV + 1
|
Установка регистра MAR на старое значение LV; чтение старого значения LV
|
ireturn5
|
PC = MDR; rd
|
Восстановление PC
|
ireturn6
|
MAR = SP
|
|
ireturn7
|
LV = MDR
|
Восстановление LV
|
ireturn8
|
MDR = TOS; wr; goto (MBR1)
|
Сохранение результата в исходной вершине стека
|
В микроархитектуре Mic-2 некоторые команды усовершенствованы в большей степени, чем другие. Команда LDCW сокращается с 9 до 3 микрокоманд, и, следовательно, время выполнения команды уменьшается втрое. Несколько по-другому дело обстоит с командой SWAP: изначально там было 8 микрокоманд, а стало 6. Для общей производительности компьютера играет роль сокращение наиболее часто повторяющихся команд, а это команды IL0AD (было 6, стало 3), IADD (было 4, стало 3) и IFICMPEQ (было 13, стало 10 для случая, когда слова равны; было 10, стало 8 для случая, когда слова не равны). Чтобы вычислить, насколько выросла производительность, можно проверить эффективность системы по эталонному тесту, но и без этого ясно, что имеет место значительный выигрыш в быстродействии.
⇐ Предыдущая страница| |Следующая страница ⇒
|