sicp.io
5.2.4 · Метки ассемблера

Таблица меток и позиции команд

Ассемблер сканирует текст контроллера, считает только исполняемые команды и заменяет символические цели ветвления позициями в последовательности.

Вопрос для размышления

Как контроллер может использовать читаемые метки до того, как машине понадобятся числовые позиции?

  • Отличие символов меток от списков команд
  • Подсчет позиций команд без учета меток
  • Построение таблицы от каждой метки к ее следующей команде
  • Разрешение целей branch и goto с удалением меток

extract-labels передает позицию следующей команды. При обнаружении символа эта позиция записывается без увеличения, а при обнаружении команды позиция увеличивается. Поэтому start именует 0, loop именует 1, а done именует 5.

assemble пропускает символы меток и вызывает resolve для замены только целей branch и goto. Обычные команды остаются без изменений. Возвращаемая последовательность представляет собой ассемблированные данные контроллера с числовыми целями. Этот урок не выполняет эту последовательность и не доказывает полный ассемблер машины.

Код SICP524 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Первая программа возвращает ((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?). Предскажите запись для нее в таблице и то, изменится ли позиция какой-либо из существующих команд.

    Показать подсказку

    Метка именует следующую команду, но не занимает позицию команды.

    Завершить этот урок

    В этой главе пройдено 0 из 23 урока0%