Метки ассемблируются, а assign, test, branch, goto, save, restore, perform и halt работают над регистровым файлом, стеком, флагом и счетчиком команд.
Вопрос для размышления
Какой общий протокол позволяет одному симулятору выполнять контроллеры для совершенно разных машин?
Представление меток контроллера отдельно от исполняемых инструкций
Вычисление источников констант, регистров, меток и операций
Выполнение инструкций assign, test, branch, goto, save, restore, perform и halt
Явное сохранение регистров, стека, flag, pc, таблицы операций и счетчика инструкций
Ограничение числа шагов выполнения машины без изменения контроллера
Проход ассемблера подсчитывает только списки инструкций и связывает каждую метку с позицией следующей инструкции. Затем машина сохраняет очищенную последовательность инструкций, таблицу меток, изменяемые ячейки регистров, стек, таблицу операций, pc, flag, состояние halt и число выбранных инструкций в виде явных данных.
Процедура evaluate-source задает единый смысл для форм const, reg, label и op. Процедура execute-one! выбирает уже ассемблированную инструкцию и применяет правило для ее тега. Контроллер алгоритма Евклида использует присваивание, проверку, ветвление, переход goto по метке и инструкцию perform. Контроллер подпрограммы дополнительно сохраняет и восстанавливает continuation, а затем возвращает управление по адресу в регистре. Симулятор регистровой машины в этом уроке выполняет указанный набор инструкций над явным состоянием машины.
Машина алгоритма Евклида возвращает (complete 2 0 33 ((40 6) (6 4) (4 2) (2 0))). Машина с continuation возвращает (complete 10 #t 10).
На что обратить внимание в трассе
Проследите, как метки преобразуются в числовые позиции перед выполнением. В машине алгоритма Евклида отделите пару test и branch от цикла редукции из семи инструкций. В запуске подпрограммы найдите сохраненный внешний continuation, временный адрес возврата, restore и два перехода goto по целевому регистру.
Попробуйте сами
Измените программу и сравните результат.
Добавьте инструкцию, которая записывает pc перед каждой выборкой, и запустите контроллер алгоритма Евклида со значениями 1071 и 462. Предскажите повторяющийся участок loop и итоговые значения регистров.
Показать подсказку
Средства измерений размещаются в цикле симулятора, а не в каждой инструкции контроллера. Сам контроллер можно оставить без изменений.