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


Двухпроходный Ассемблер - 1-й проход


Алгоритм работы 1-го прохода двухпроходного Ассемблера показан на рисунке.

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

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

  3. Признак окончания TRUE?
  4. Считывание следующей строки исходного модуля. Добавка к счетчику адреса устанавливается равной 0.
  5. При считывании был обнаружен конец файла?
  6. Если конец файла обнаружен до того, как обработана директива END, - ошибка (преждевременный конец файла), при этом также устанавливается признак окончания обработки..
  7. Лексический разбор оператора программы. При этом:

    • выделяется метка/имя, если она есть;
    • выделяется мнемоника операции;
    • выделяется поле операндов;
    • удаляются комментарии в операторе;
    • распознается строка, содержащая только комментарий.

  8. Строка содержит только комментарий? В этом случае обработка оператора не производится.
  9. Мнемоника операции ищется в таблице директив.
  10. Завершился ли поиск в таблице директив успешно?
  11. Если мнемоника была найдена в таблице директив, происходит ветвление, в зависимости от того, какая директива была опознана.
  12. Обработка директив типа DD (определения данных) включает в себя:

    • выделение элементов списка операндов (одной директивой DD может определяться несколько объектов данных);
    • определение типа и, следовательно, размера объекта данных, заданного операндом;
    • обработка для каждого операнда возможного коэффициента повторения.

  13. Добавка к счетчику адреса устанавливается равной суммарному размеру объектов данных, определяемых директивой.
  14. Обработка директив типа BSS подобна обработке директив типа DD.
  15. Добавка к счетчику адреса устанавливается равной суммарному объему памяти, резервируемому директивой.
  16. Обработка директивы END состоит в установке в TRUE признака окончания обработки.
  17. Обработка директивы включает в себя вычисление значения имени и занесение его в таблицу символов.
  18. Обработка прочих директив ведется по индивидуальным для каждой директивы алгоритмам. Существенно, что никакие директивы, кроме DD и BSS, не изменяют нулевого значения добавки к счетчику адреса.
  19. Если мнемоника операции не найдена в таблице директив, она ищется в таблице команд.
  20. Завершился ли поиск в таблице команд успешно?
  21. Если мнемоника не была найдена в таблице команд, - ошибка (неправильная мнемоника).
  22. Если мнемоника найдена в таблице команд - определение длины команды, она же будет добавкой к счетчику адреса.
  23. Есть ли в операторе литерал?
  24. Занесение литерала в таблицу литералов (если его еще нет в таблице).
  25. Была ли в операторе метка?
  26. Поиск имени в таблице символов.
  27. Имя в таблице символов найдено?
  28. Если имя найдено в таблице символов - ошибка (повторяющееся имя).Если имя не найдено в таблице символов - занесение имени в таблицу символов.
  29. Формирование и печать строки листинга.
  30. Модификация счетчика адреса вычисленной добавкой к счетчику
  31. Печать строки листинга и переход к чтению следующего оператора.
  32. При окончании обработки - закрытие файла исходного модуля.
  33. Были ли ошибки на 1-ом проходе ассемблирования?
  34. Формирование литерального пула
  35. Выполнение 2-го прохода ассемблирования.
  36. Конец работы Ассемблера.

<


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