Таблица 4.3. Микропрограмма для микроархитектуры Mic-1
Микрокоманда
|
Операции
|
Комментарий
|
Maini
|
РС = РС+ 1; fetch; goto(MBR)
|
MBR содержит код операции; получение следующего байта; отсылка
|
порі
|
goto Mainl
|
Ничего не происходит
|
iadcM
|
MAR = SP = SP - 1; rd
|
Чтение слова, идущего после верхнего слова стека
|
iadd2
|
H = TOS
|
Н = вершина стека
|
iadd3
|
MDR = TOS = MDR + H; wr; goto Mainl
|
Суммирование двух верхних слов; запись суммы в верхнюю позицию стека
|
isubl
|
MAR = SP = SP - 1; rd
|
Чтение слова, идущего после верхнего слова стека
|
isub2
|
H = TOS
|
Н = вершина стека
|
isub3
|
MDR = TOS = MDR - H; wr; goto Mainl
|
Вычитание; запись результата в вершину стека
|
Микрокоманда
|
Операции
|
Комментарий
|
iancM
|
MAR = SP = SP - 1; rd
|
Чтение слова, идущего после верхнего слова стека
|
iand2
|
H = TOS
|
Н = вершина стека
|
iand3
|
MDR = TOS = MDR И H; wr; goto Mainl
|
Операция И; запись результата в вершину стека
|
ior1
|
MAR = SP = SP - 1; rd
|
Чтение слова, идущего после верхнего слова стека
|
ior2
|
H = TOS
|
Н = вершина стека
|
іогЗ
|
MDR = TOS = MDR ИЛИ H; wr; goto Mainl
|
Операция ИЛИ; запись результата в вершину стека
|
dupl
|
MAR = SP = SP + 1
|
Увеличение SP на 1 и копирование результата в регистр MAR
|
dup2
|
MDR = TOS; wr; goto Mainl
|
Запись нового слова в стек
|
pop1
|
MAR = SP = SP - 1; rd
|
Чтение слова, идущего после верхнего слова стека
|
pop2
|
|
Программа ждет, пока считается из памяти новое значение регистра TOS
|
рорЗ
|
TOS = MDR; goto Mainl
|
Копирование нового слова в регистр TOS
|
swapl
|
MAR = SP = SP - 1; rd
|
Установка регистра MAR на значение SP -1; чтение второго слова из стека
|
swap2
|
MAR = SP
|
Установка регистра MAR на верхнее слово стека
|
swap3
|
H = MDR; wr
|
Сохранение значения TOS в регистре Н; запись второго слова в вершину стека
|
swap4
|
MDR = TOS
|
Копирование прежнего значения TOS в регистр MDR
|
swap5
|
MAR - SP - 1; wr
|
Установка регистра MAR на значение SP-1; запись второго слова в стек
|
swap6
|
TOS = H; goto Mainl
|
Обновление TOS
|
bipushl
|
SP = MAR = SP + 1
|
MBR = байт, который нужно поместить в стек
|
bipush2
|
PC = PC + 1; fetch
|
Увеличение PC на 1; вызов кода следующей операции
|
bipush3
|
MDR = TOS = MBR; wr; goto Mainl
|
Добавление к байту дополнительного знакового разряда и запись значения в стек
|
iloadl
|
H = LV
|
MBR содержит индекс; копирование значения LV в Н
|
iload2
|
MAR = MBRU + H; rd
|
MAR = адрес локальной переменной, которую нужно поместить в стек
|
iload3
|
MAR = SP = SP +1
|
Регистр SP указывает на новую вершину стека; подготовка к записи
|
iload4
|
PC = PC + 1; fetch; wr
|
Увеличение значения PC на 1; вызов кода следующей операции; запись вершины стека
|
Таблица 4.3 (продолжение)
|
Микрокоманда
|
Операции
|
Комментарий
|
iload5
|
TOS = MDR; goto Mainl
|
Обновление TOS
|
istorel
|
H = LV
|
MBR содержит индекс; копирование значения LV в Н
|
istore2
|
MAR = MBRU + H
|
MAR = адрес локальной переменной,
в которой нужно сохранить слово из стека
|
istore3
|
MDR = TOS; wr
|
Копирование значения TOS в регистр MDR; запись слова
|
istore4
|
SP= MAR = SP - 1; rd
|
Чтение из стека второго слова сверху
|
istore5
|
PC = PC + 1; fetch
|
Увеличение PC на 1; вызов следующего кода операции
|
istore6
|
TOS = MDR; goto Mainl
|
Обновление TOS
|
widel
|
PC = PC+ 1;fetch
|
Вызов байта операнда или кода следующей операции
|
wide2
|
goto(MBR ИЛИ 0x100)
|
Межуровневый переход к старшим адресам
|
widejloadl
|
PC = PC + 1 ;fetch
|
MBR содержит первый байт индекса; вызов второго байта
|
wide_iload2
|
H = MBRU « 8
|
Н = первый байт индекса, сдвинутый влево на 8 бит
|
wide_iload3
|
H=MBRU ИЛИ H
|
Н = 16-разрядный индекс локальной переменной
|
wide_iload4
|
MAR = LV + H; rd; goto iload3
|
MAR = адрес локальной переменной, которую нужно записать в стек
|
widejstorel
|
PC = PC + 1 ;fetch
|
MBR содержит первый байт индекса; вызов второго байта
|
wide_istore2
|
H = MBRU « 8
|
Н = первый байт индекса, сдвинутый влево на 8 бит
|
wide_istore3
|
H = MBRU ИЛИ H
|
Н = 16-разрядный индекс локальной переменной
|
wide_istore4
|
MAR = LV + H; rd; goto istore3
|
MAR = адрес локальной переменной, в которую нужно записать слово из стека
|
Idc_w1
|
PC = PC + 1;fetch
|
MBR содержит первый байт индекса; вызов второго байта
|
Idc_w2
|
H = MBRU « 8
|
Н = первый байт индекса, сдвинутый влево на 8 бит
|
Idc_w3
|
H = MBRU ИЛИ H
|
Н = 16-разрядный индекс константы в наборе констант
|
Idc_w4
|
MAR = H + CPP; rd; goto iload3
|
MAR = адрес константы в наборе констант
|
und
|
H = LV
|
MBR содержит индекс; копирование значения LV в Н
|
iinc2
|
MAR = MBRU+H; rd
|
Копирование суммы значения LV и индекса в регистр MAR; чтение переменной
|
ііпсЗ
|
PC = PC + 1; fetch
|
Вызов константы
|
Микрокоманда
|
Операции
|
Комментарий
|
iinc4
|
H = MDR
|
Копирование переменной в регистр H
|
iinc5
|
PC = PC + 1 ; fetch
|
Вызов следующего кода операции
|
ііпсб
|
MDR = MBR + H; wr; goto Mainl
|
Запись суммы в регистр MDR; обновление переменной
|
gotol
|
OPC = PC - 1
|
Сохранение адреса кода операции
|
goto2
|
PC = PC + 1 ; fetch
|
MBR = первый байт смещения; вызов второго байта
|
goto3
|
H = MBR « 8
|
Сдвиг первого байта влево на 8 бит и сохранение его в регистре H
|
goto4
|
H = MBRU ИЛИ H
|
H =16-разрядное смещение перехода
|
goto5
|
PC = OPC + H; fetch
|
Суммирование смещения и ОРС
|
goto6
|
goto Mainl
|
Ожидание вызова следующего кода операции
|
ifltl
|
MAR = SP = SP - 1 ; rd
|
Чтение второго сверху слова в стеке
|
iflt2
|
OPC = TOS
|
Временное сохранение TOS в ОРС
|
iflt3
|
TOS = MDR
|
Запись новой вершины стека в TOS
|
iflt4
|
N = OPC; if(N) goto T; else goto F
|
Переход по биту N
|
ifeql
|
MAR = SP = SP - 1 ; rd
|
Чтение второго сверху слова в стеке
|
ifeq2
|
OPC = TOS
|
Временное сохранение TOS в ОРС
|
ifeq3
|
TOS = MDR
|
Запись новой вершины стека в TOS
|
ifeq4
|
Z = OPC; if(Z) goto T; else goto F
|
Переход по биту Z
|
if_icmpeq1
|
MAR = SP = SP - 1 ; rd
|
Чтение второго сверху слова в стеке
|
if_icmpeq2
|
MAR = SP = SP - 1
|
Установка регистра MAR на чтение новой вершины стека
|
if_icmpeq3
|
H = MDR; rd
|
Копирование второго слова из стека в регистр H
|
if_icmpeq4
|
OPC = TOS
|
Временное сохранение TOS в ОРС
|
if_icmpeq5
|
TOS = MDR
|
Помещение новой вершины стека в TOS
|
if_icmpeq6
|
Z = OPC - H; if(Z) goto T; else goto F
|
Если два верхних слова равны, осуществляется переход к Т; если они не равны, осуществляется переход к F
|
T
|
OPC = PC - 1 ; fetch; goto goto2
|
То же, что gotol ; нужно для адреса целевого объекта
|
F
|
PC = PC + 1
|
Пропуск первого байта смещения
|
F2
|
PC = PC + 1 ; fetch
|
PC указывает на следующий код операции
|
F3
|
goto Mainl
|
Ожидание вызова кода операции
|
invoke_virtual1
|
PC = PC + 1 ; fetch
|
MBR = первый байт индекса; увеличение PC на 1 ; вызов второго байта
|
invoke_virtual2
|
H = MBRU « 8
|
Сдвиг первого байта на 8 бит
и сохранение значения в регистре H
|