Системное программирование. Конспект лекций


Модель процессора


Работа процессора моделируется алгоритмом работы Интерпретатора. Основной алгоритм работы модели состоит из цикла, в каждой итерации которого моделируется выполнение одной команды целевой программы. Итерация этого цикла начинается с выборки байта, записанному в модели памяти по адресу, содержащемуся в модели регистра-счетчика адреса. В подавляющем большинстве ВС первый байт команды содержит код операции, позволяющий однозначно идентифицировать команду. Интерпретатор выполняет поиск по коду операции в таблице команд. При этом может использоваться либо таблица команд Ассемблера, либо ее модификация с расширениями и с возможностью быстрого поиска по коду операции. Распознав команду, Интерпретатор выбирает ее остальные байты (их количество определено в таблице команд) и выделяет из них операнды команды (их количество и кодировка определяется типом команды). Далее алгоритм Интерпретатора разветвляется, в общем случае число ветвей равно числу возможных кодов операции. В каждой ветви вычисляется значение, являющееся результатом выполнения той или иной команды. Вычисленное значение заносится в объект, являющийся для данной команды приемником результата. Кроме того для тех команд, для которых это требуется устанавливаются значения признаков в регистре состояния (перечень признаков, устанавливаемых командой, может содержаться в таблице команд Интерпретатора). Вычисляется новое значение регистра-счетчика адреса. В большинстве случаев это значение получается добавлением к текущему его значению длины команды, но в командах перехода (типа 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;
Очевидно, что RISC-модель будет выполняться быстрее, но CISC-модель гибче, так как активные элементы (команды) в ней превращены в пассивные (данные). В аппаратных архитектурах предпочтение отдается RISC из-за высшей эффективности, а какие критерии являются более важными при отладке?


Содержание раздела