Cтраница 3
![]() |
Блок обработки макроопределений. [31] |
В этот момент все операторы тела макроопределения находятся на рабочем поле, и сформирована таблица внутренних имен. [32]
Адрес - для всех программных и общих секций указывается начальный относительный адрес, а для внутренних имен - их адрес в секции, к которой они принадлежат. [33]
В ходе трансляции блок обработки макроопределений создает пять временных таблиц: таблицу позиционных параметров, таблицу внутренних имен, таблицу ключевых параметров, таблицу описаний макрокоманд и таблицу макрокоманд. [34]
Таким образом, сокращенная версия программы COMPARE предназначена для считывания информации из двух входных потоков с внутренними именами, по договоренности обозначенными как FILE1 и FILE2, и требует от пользователя установления связи соответствующих внешних файлов с этими внутренними именами с помощью управляющей карты или команды. Этой программой COMPARE не предпринимается какого-либо определенного действия для связи с источниками информации - кто-то за нее должен выполнить это. [35]
В головной программе запрещается использовать имена 12, J2, С2, так как они являются внутренними именами подпрограммы интерполирования функции. [36]
По тем же причинам, по которым в ассемблере приходится применять двухпросмотровую схему трансляции, для замены внутренних имен требуется дважды просмотреть тело каждого макроопределения. Во время первого просмотра выявляются все внутренние имена и определяются их адреса относительно начала тела макроопределения. При втором просмотре внутренние имена в операндах заменяются относительными выражениями. Из поля названия внутренние имена удаляются. Эту работу для каждого макроопределения нужно выполнить только один раз, в то время как замену параметров значениями операндов макрокоманды приходится повторять вновь для каждого вхождения макрокоманды. В связи с этим в макрогенераторе обработку макроопределений и обработку макрокоманд выполняют два различных блока. [37]
Операция НАЙТИ ( г) выполняется, как и раньше, обращением к Rli ] для установления внутреннего имени множества, содержащего элемент i в данный момент. [38]
Итак, теперь определены абсолютные адреса для всех имен, использованных в каждом из модулей ( адрес каждого внутреннего имени М равен ан Ам, где ан - начало в памяти данного модуля, а Ам - относительный номер строки в модуле, которой дано имя М), так что в итоге получаем следующие таблицы соответствия между именами объектов и их абсолютными адресами. [39]
Помимо адреса константы в таблицу заносят порядковый номер имени в таблице внешних имен ( если константа зависит от внутреннего имени, то фиксируются номер имени исходной программы - секции), длина константы и знак ( - - или -), с которым имя входит в выражение, определяющее значение адресной константы. [40]
В основной программе запрещается при этом использовать для обозначения переменных имена XI, SI, HI, Tl, поскольку они являются внутренними именами подпрограммы вычисления определенного интеграла. [41]
Если задан режим XREF, то на печать выдается таблица перекрестных ссылок ( CROSS REFERENCE LISTING), в которой в алфавитном порядке распечатываются внешние и внутренние имена переменных. [42]
В основной программе не разрешается использовать имена переменных 16, J6, Т6, Р6, D6, L6, Кб, R6, являющиеся внутренними именами подпрограммы. После выхода из подпрограммы значения исходного массива С6 не сохраняются, поэтому при многократном обращении к подпрограмме необходимо организовать его повторный ввод. [43]
Если задан режим SYM, то вьщается на печать таблица смещений ( OFFSET TABLE), в которой вместо идентификаторов, употребляемых программистом, указываются их внутренние имена. Таблицу смещений условно можно разбить на четыре графы. [44]
Заметим, что в рассмотренных выше способах доступа к внешним объектам идентификатор, использованный в качестве внешнего имени, уже не может быть использован в качестве внутреннего имени, что накладывает определенные ограничения на выбор внутренних имен. [45]