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


Двухпроходный Ассемблер - 2-й проход - часть 4


Мы исходили из того, что 2-й проход использует промежуточный файл, сформированный 1-ым проходом. Если же 2-й проход использует исходный модуль, то алгоритм должен быть расширен лексическим разбором оператора, распознаванием мнемоники и подсчетом адресов - так же, как и в 1-ом проходе.

  1. Начало 2-го прохода ассемблирования.
  2. Начальные установки:

    • создание пустой таблицы базовых регистров;
    • открытие промежуточного файла исходного модуля;
    • установка в FASLE признака окончания

  3. Признак окончания TRUE?
  4. Считывание следующей записи промежуточного файла.
  5. Если запись промежуточного файла описывает комментарий, переход на печать строки листинга
  6. Выясняется, содержит оператор команду или директиву
  7. Если оператор содержит команду, формируется байт кода операции (код выбирается из таблицы команд) в объектном коде.
  8. Выделение следующего элемента из списка операндов с удалением его из списка и с проверкой, не обнаружен ли при выделении конец списка операндов?
  9. Если конец не обнаружен, обрабатывается выделенный операнд. Проверяется, не превысило ли число операндов требуемого для данного типа команды (выбирается из таблицы команд)
  10. Если число операндов превышает требуемое - формирование сообщения об ошибке
  11. Если число операндов правильное, распознается и проверяется тип операнда.
  12. Если тип операнда не распознан или недопустим для данной команды - формирование сообщения об ошибке.
  13. Есть ли в команде имя?
  14. Если в команде есть имя, оно ищется в таблице символов.
  15. Если имя в таблице символов не найдено - формирование сообщения об ошибке.
  16. Если найдено имя в таблице символов, оно переводится в "база-смещение"
  17. Если имени в команде нет, выполняется разбор и интерпретация операнда с проверкой правильности его кодирования.
  18. Если обнаружены ошибки в кодировании операнда - формирование сообщения об ошибке.
  19. Формируется код поля операнда и заносится в объектный код команды и обрабатывается следующий элемент списка операндов.
  20. Если обнаружен конец списка операндов, проверяется, не меньше ли число операндов требуемого для данного типа команды. Если число операндов соответствует требуемого, управление переходит на вывод объектного кода.
  21. Если число операндов меньше требуемого - формирование сообщения об ошибке
  22. Если обрабатываемый оператор является директивой, алгоритм разветвляется, в зависимости от того, какая это директива. При обработке любой директивы производится разбор и анализ ее операндов и (не показано на схеме алгоритма) возможно формирование сообщения об ошибке.
  23. Обработка директивы типа DD включает в себя:

    • выделение элементов списка операндов;
    • для каждого элемента - распознавание типа и значения константы;
    • генерация объектного кода константы;
    • обработка возможных коэффициентов повторения.

  24. Обработка директивы типа BSS может вестись точно так же, как и DD за исключением того, что вместо кода константы генерируются некоторые "пустые" коды. Однако, эти коды не нужны в объектном модуле, они могут не генерироваться, в этом случае должны предприниматься некоторые действия, формирующие "разрыв" в объектных кодах.
  25. Обработка директивы типа USING (ASSUME) включает в себя занесение в соответствующую строку таблицы базовых регистров значения операнда-адреса и установку для данного регистра признака использования.
  26. Обработка директивы типа USING (ASSUME) включает в себя занесение в соответствующую строку таблицы базовых регистров значения операнда-адреса и установку для данного регистра признака использования.
  27. Обработка директивы END устанавливает признак окончания в TRUE. При обработке этой директивы в объектный модуль также может заносится стартовый адрес программы - параметр директивы.
  28. Обработка прочих директив ведется по своим алгоритмам.
  29. После окончания обработки команды или директивы сформированный объектный код выводится в файл объектного модуля.
  30. Печать строки листинга. На эту точку также управление передается при выявлении ошибок. При наличии ошибки сообщение об ошибке печатается после строки листинга. Управление затем передается на считывание следующей записи промежуточного файла.
  31. После того, как установлен признак окончания работы формируются и выводятся в объектный модуль коды литерального пула, таблицы связываний и перемещений.
  32. Закрываются файлы, освобождается выделенная память.
  33. Работа Ассемблера завершается

При рассмотрении алгоритма мы принимали во внимание только генерацию объектных кодов, соответствующих командам и константам. Мы не рассматривали то, какова общая структура объектного модуля. Эти вопросы будут рассматриваться в Теме 4.




- Начало -  - Назад -  - Вперед -