Модель процессора
Работа процессора моделируется алгоритмом работы Интерпретатора. Основной алгоритм работы модели состоит из цикла, в каждой итерации которого моделируется выполнение одной команды целевой программы. Итерация этого цикла начинается с выборки байта, записанному в модели памяти по адресу, содержащемуся в модели регистра-счетчика адреса. В подавляющем большинстве ВС первый байт команды содержит код операции, позволяющий однозначно идентифицировать команду. Интерпретатор выполняет поиск по коду операции в таблице команд. При этом может использоваться либо таблица команд Ассемблера, либо ее модификация с расширениями и с возможностью быстрого поиска по коду операции. Распознав команду, Интерпретатор выбирает ее остальные байты (их количество определено в таблице команд) и выделяет из них операнды команды (их количество и кодировка определяется типом команды). Далее алгоритм Интерпретатора разветвляется, в общем случае число ветвей равно числу возможных кодов операции. В каждой ветви вычисляется значение, являющееся результатом выполнения той или иной команды. Вычисленное значение заносится в объект, являющийся для данной команды приемником результата. Кроме того для тех команд, для которых это требуется устанавливаются значения признаков в регистре состояния (перечень признаков, устанавливаемых командой, может содержаться в таблице команд Интерпретатора). Вычисляется новое значение регистра-счетчика адреса. В большинстве случаев это значение получается добавлением к текущему его значению длины команды, но в командах перехода (типа JMP, CALL) это значение вычисляется.
При реализации алгоритмов выполнения отдельных команд возможны два подхода, которые мы называем RISC и CISC-моделями, по аналогии с архитектурами процессоров (однако выбор программной RISC или CISC-модели необязательно должен совпадать с реальной архитектурой процессора).
Смысл RISC-модели состоит в том, что разветвление алгоритма выполняется сразу же после распознавания команды и выполнение каждой команды полностью реализуется кодами соответствующей ветви.
Смысл CISC-модели состоит в том, что выполнение каждой команды представляется в виде последовательности выполнения простых процедур ("микрокоманд"). Список микрокоманд, составляющих выполнение каждой команды, может быть "зашит" в программу в виде последовательности вызовов или представлен в виде данных, например, в виде списка номеров процедур. В последнем случае алгоритм не требует ветвления, а сводится к циклу, в каждой итерации которого выбирается номер очередной процедуры и вызывается процедура с данным номером. В предельном случае выполнение каждой команды может быть представлено в виде исходного текста на языке макрокоманд, который интерпретируется Интерпретатором.
Пример
Пусть в языке микрокоманд имеются следующие (показаны не все) микрокоманды:
Микрокоманда | Выполнение |
GETR n,rx | Выборка номера регистра, заданного в n-ом операнде в промежуточную переменную rx |
GETA n,ax | Выборка адреса, заданного в n-ом операнде в промежуточную переменную ax |
LDR dx,rx | Выборка данных из регистра, номер которого находится в промежуточной переменной rx в промежуточную переменную dx |
LDM dx,ax | Выборка данных из памяти по адресу, находящемуся в промежуточной переменной ax промежуточную переменную dx |
SDR rx,dx | Запись данных из промежуточной переменной dx в регистр, номер которого находится в промежуточной переменной rx |
SDM dx,ax | Запись данных из промежуточной переменной dx в память по адресу, находящемуся в промежуточной переменной ax промежуточную переменную dx |
ADD dx1,dx2 | Сложение данных из промежуточной переменной dx1 с данными из dx2; результат - в dx1 |
SIG dx | Инверсия знака данных, содержащихся в промежуточной переменной dx |
CC1 dx | Установка признаков "больше", "меньше", "равно" по значению, содержащемуся в промежуточной переменной dx |
CC2 dx | Установка признака переполнения по значению, содержащемуся в промежуточной переменной dx |
PC1 | Увеличение регистра-счетчика адреса на длину команды |
PC2 dx | Запись данных из промежуточной переменной dx в регистр-счетчика адреса |
END | Окончание микропрограммы |
Тогда реализация некоторых машинных команд может быть "замикропрограммирована" следующим образом:
Команда языка Ассемблера | Выполнение | Микропрограммная реализация |
LR регистр2,регистр1 | Пересылка данных из регистра1 в регистр2 | GETR 2, r1; LDR d1,r1; GETR 1,r2; SDR r2,d1, PC1; END; |
L регистр,память | Пересылка данных из памяти по адресу память в регистр | GETA 2,a1; LDM d1,a1; GETR 1,r1; SDR r1,d1; PC1; END; |
AR регистр2,регистр1 | Сложение данных из регистра1 с данными в регистре2; результат - в регистре1 | GETR 2, r1; LDR d1,r1; GETR 1,r2; LDR d2, r2; ADD d1,d2; SDR r1; PC1; END; |
CMP регистр,память | Сравнение данных, содержащихся в регистре с данными по адресу память | GETR 1,r1; LDR d1,r1; GETA 2, a1; LDM d2,a1; SIG d2; ADD d1,d2; CC1 d1; CC2 d1; PC1; END; |
JMP память | Переход по адресу память | GETA 2,a2; PC2 a2; END; |