Cтраница 2
Получив управление от блока выделения имен, блок распределения памяти создает область литералов, в которую включаются все те литералы, которые встретились в исходной программе после последней команды LTORG. В таблице литералов эти литералы к моменту завершения первого просмотра не имеют адресов и записаны после условной записи, являющейся признаком конца последней области литералов, созданной командой LTORG. Если в исходной программе не было команд LTORG, то ни один литерал не имеет адреса. [16]
Обработка машинной команды завершается просмотром поля операндов, включая строку продолжения, если она есть. Литералы, встретившиеся в поле операндов, заносятся в таблицу литералов вместе с характеристикой длины. [17]
После прочтения директивы END первый проход завершается. В этот момент можно сохранить таблицу символьных имен и таблицу литералов, если это необходимо. [18]
![]() |
Представление лексических правил в БНФ. [19] |
Числа, строки символов, заключенные в кавычки, и другие самоопределенные данные классифицируются как литералы. После того как лексическая единица классифицирована как литерал, опрашивается таблица литералов. [20]
Смещение принимается равным разности значения символа в таблице символов и содержимого выбранного базового регистра. Приведенная ниже программа на языке ассемблера иллюстрирует использование таблиц переменных ( таблицы символов, таблицы литералов и таблицы базовых регистров) и может служить для лучшего понимания алгоритмов, представленных в следующем разделе. Основное внимание будет обращено на, йроблему ассемблирования этой программы, ее конкретные функции для нас интереса не представляют. [21]
Основные элементы исходной программы помещаются затем в таблицу однородных символов. Для каждого обозначения указывается его синтаксический класс ( целое, идентификатор, ограничитель, зарезервированное слово), и с помощью указателя задается место, в котором хранится его исходная форма. Таким образом выполняется первый шаг построения таблиц литералов и идентификаторов. [22]
Таблица литералов хранит все литералы, встречающиеся в программе. Идентичные по написанию литералы включаются в таблицу только один раз. Адреса назначаются литералам после завершения первого просмотра исходной программы или по команде LTORG. Записи таблицы литералов имеют переменную длину, зависящую от количества знаков в литерале. [23]
Мы опять выбираем общий путь представления этой фазы, чтобы показать и результат генерации, и некоторые методы машинно-зависимой оптимизации. Большинство современных компиляторов следуют описанной здесь методике. Возвращаясь к рис. 8.13, отметим, что фаза генерации использует матрицу в качестве входной информации, а также кодовые продукции ( макроопределения), которые определяют операции, появляющиеся в матрице. Она, кроме того, обращается к таблице идентификаторов и таблице литералов для генерирования соответствующих адресов и преобразований типов данных. [24]
Заметим, что значением всех переменных в таблице идентификаторов являются двоичные числа с фиксированной точкой. Так что каждой из них отводится отдельное слово. Литералами являются десятичные числа, а в Системе 360 они хранятся в упакованном виде, по две цифры в байте. Элемент матрицы явно указывает, что литеральная область памяти состоит из трех байтов и что при генерации кода эта область должна быть заполнена значениями литералов, взятыми в таблице литералов. [25]
![]() |
Представление лексических правил в БНФ. [26] |
Числа, строки символов, заключенные в кавычки, и другие самоопределенные данные классифицируются как литералы. После того как лексическая единица классифицирована как литерал, опрашивается таблица литералов. В отличие от идентификаторов, литералы позволяют определить их атрибуты и внутреннее представление при просмотре составляющих их символов. Таким образом, каждый новый элемент, создаваемый в таблице, состоит из литерала и всех его атрибутов. Не зависимо от того, создан новый элемент таблицы литералов или нет, создается стандартный символ типа LIT и помещается в таблицу стандартных символов. [27]
Таким образом, программисту не нужно писать директиву, чтобы разместить слово в памяти, придать ему значение 5, дать ему метку, а затем использовать эту метку в команде L. Константы, для которых ассемблер автоматически резервирует память, называются литералами. Литералы упрощают читаемость и понимание программы, делая значение константы очевидным в исходном операторе. При первом проходе ассемблер должен создать таблицу из всех литералов, которые используются в программе. Все три компьютера, которые мы взяли в качестве примеров, содержат команды с непосредственными адресами, поэтому их ассемблеры не обеспечивают литералы. Команды с непосредственными адресами в настоящее время считаются обычными, но раньше они рассматривались как нечто совершенно необычное. Вероятно, широкое распространение литералов внушило разработчикам, что непосредственная адресация - это очень хорошая идея. Если нужны литералы, то во время ассемблирования сохраняется таблица литералов, в которой появляется новый элемент всякий раз, когда встречается литерал. После первого прохода таблица сортируется и продублированные элементы удаляются. [28]