5.2. Программа моделирования регистровых машин
475
Для доступа к стеку используются следующие процедуры:
(define (pop stack)
(stack ’pop))
(define (push stack value)
((stack ’push) value))
Базовая машина
Процедура make-new-machine, приведенная на рисунке 5.13, порождает объект,
внутреннее состояние которого состоит из стека, изначально пустой последовательности
команд, списка операций, где с самого начала присутствует операци я инициализации сте-
ка, а также таблицы регистров (register table), в которой изначально содержатся два
регистра, flag и pc (от program counter, «счетчик программы»). Внутренняя процеду-
ра allocate-register добавляет в таблицу новый элемент, а внутренняя процедура
lookup-register ищет регистр в таблице.
Регистр flag используется для управления переходами в имитируемой машине. Ко-
манды test присваивают ему результат теста (истину или ложь). Команды branch
определя ют, нужно ли делать переход, в зависимости от значения ре гистра flag.
Регистр pc определяет порядок выполнения команд при работе машины. Этот порядок
реализуется внутренней процедур ой execute. В нашей имитационной модели каждая
команда является с труктурой данных, в которой есть процедура без аргументов, называ-
емая исполнительная процедура команды (instruction execution procedure). Вызов этой
процедуры имитирует выполнение команды. Во время работы моде ли pc указывает на
часть последовательности команд, начинающую ся со следующей подлежащей исполне-
нию команды. Процедура execute считывает эту команду, выполняет ее при помощи
вызова исполните льной процедуры, и повторяет этот процесс, пока и меется команды для
выполнения (то есть пока pc не станет указывать на конец последовательности команд).
В процессе работы каждая исполните льная процедура изменяет pc и указывает, ка-
кую следующую команду надо выполнить. Команды branch и goto присваивают реги-
стру pc значение, указывающее на новый адрес. Все остальные команды просто продви-
гают pc так, чтобы он указывал на следующую команду в последовательности. Заметим,
что каждый вызов execute снова зовет execute, но это не приводит к бесконечному
циклу, поскольку запуск исполнительной процедуры команды изменяет содержимое pc.
Make-new-machine возвращает процедуру dispatch, которая дает доступ к внут-
реннему состоянию на основе передачи сообщений. Запуск машины осуществляется пу-
тем установки pc в начало последовательности команд и вызова execute.
Ради удобства мы предоставляем альтернативный процедурный интерфейс для опе-
рации start регистровой машины, а также процедуры для доступа к содержимому
регистров и их изменения, как указано в начале раздела 5.2:
(define (start machine)
(machine ’start))
(define (get-register-contents machine register-name)
(get-contents (get-register machine register-name)))