Таблица меток и позиции команд
Ассемблер сканирует текст контроллера, считает только исполняемые команды и заменяет символические цели ветвления позициями в последовательности.
Как контроллер может использовать читаемые метки до того, как машине понадобятся числовые позиции?
- Отличие символов меток от списков команд
- Подсчет позиций команд без учета меток
- Построение таблицы от каждой метки к ее следующей команде
- Разрешение целей branch и goto с удалением меток
extract-labels передает позицию следующей команды. При обнаружении символа эта позиция записывается без увеличения, а при обнаружении команды позиция увеличивается. Поэтому start именует 0, loop именует 1, а done именует 5.
assemble пропускает символы меток и вызывает resolve для замены только целей branch и goto. Обычные команды остаются без изменений. Возвращаемая последовательность представляет собой ассемблированные данные контроллера с числовыми целями. Этот урок не выполняет эту последовательность и не доказывает полный ассемблер машины.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает ((start . 0) (loop . 1) (done . 5)). Вторая возвращает ((assign n 3) (test zero?) (branch 5) (assign n sub1) (goto 1) (halt)).
Следите за тем, как позиция увеличивается только для списков команд, затем найдите поиск в assoc для done и loop перед тем, как branch и goto получат 5 и 1. Итоговый список представляет собой ассемблированные данные, а не запуск машины.
Измените программу и сравните результат.
Вставьте метку с именем check непосредственно перед (test zero?). Предскажите запись для нее в таблице и то, изменится ли позиция какой-либо из существующих команд.
Показать подсказку
Метка именует следующую команду, но не занимает позицию команды.