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


Двухпроходный Ассемблер - 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. Конец работы Ассемблера.

<
Примечания


  1. Определение длины команды (п.21). Эта задача может решаться существенно разным образом для разных языков. В языках некоторых Ассемблеров мнемоника команды однозначно определяет ее формат и длину (S/390, все RISC-процессоры). В этом случае длина команды просто выбирается из таблицы команд. В других языках длина и формат зависит от того, с какими операндами употреблена команда (Intel). В этом случае длина вычисляется по некоторому специфическому алгоритму, в который входит выделение отдельных операндов и определение их типов. В последнем случае должна производиться также необходимая проверка правильности кодирования операндов (количество операндов, допустимость типов).
  2. Обнаружение литералов (п.22). Требует, как минимум, выделения операндов команды. (Подробнее об обработке литералов см. ниже).
  3. Листинг. Строка листинга печатается в конце каждой итерации обработки команды. Строка листинга 1-го прохода содержит: номер оператора, значение счетчика адреса (только для команд и директив, приводящих к выделению памяти), текст оператора. Листинг 1-го прохода не является окончательным, фактически он используется только для поиска ошибок, поэтому печатать его необязательно. Режим печати листинга 1-го прохода может определяться параметром Ассемблера или специальной директивой. После листинга программы может (опционно) печататься таблица символов.
  4. /i>Ошибки. На первом проходе выявляются не все ошибки, а только те, которые связаны с выполнением задачи 1-го прохода. Сообщение об ошибке включает в себя: код ошибки, диагностический текст, номер и текст оператора программы, в котором обнаружена ошибка.



Содержание раздела