Вперед Назад Содержание

5. Символы

Символ - основное понятие: программист использует символы для именования различных сущностей, редактор связей (линкер) использует символы для связывания, отладчик использует символы в ходе отладки.

Предупреждение: as помещает символы не в том порядке, в котором они описаны. Это может быть несовместимо с некоторыми отладчиками.

5.1 Метки

Метка пишется как символ, за которым сразу следует двоеточие `:'. Этот символ представляет текущее значение активного счетчика места и является, например, подходящим операндом инструкции. Если вы используете один и тот же символ для пpедставления двyх pазличных мест, то пеpвое опpеделения пеpекрывает все остальные.

Hа HPPA обычная форма метки не требует наличия двоеточия; вместо этого метка должна начинаться с нулевой колонки. Только одна метка может быть определена в одной строке. Для того, чтобы обойти это ограничение, в версии as для HPPA предусмотрена директива .label для более гибкого определения меток.

5.2 Придание символам других значений

Символу может быть придано любое значение написанием символа, за которым следует знак "=", а затем выражение (смотрите главу 6,"Выражения"). Это эквивалентно использованию директивы .set. Смотрите раздел 7.49[.set].

5.3 Имена Символов

Имена символов начинаются с буквы или с одного из знаков '.' или '_'. На большинстве машин Вы можете также использовать '$' в именах символов, исключения смотрите в главе 8, "Архитектурные особенности". За этим знаком может следовать любая строка из цифр, букв, знаков доллара (если противное не оговорено в главе 8, "Архитектурные особенности") и подчеркиваний. Для семейства AMD29K в именах символов допустим '?', но не как первый знак имени.

Регистр букв имеет значение: foo и Foo - различные имена символов.

Каждый символ имеет только одно имя. Каждое имя в ассемблерной программе относится только к одному символу. Вы можете использовать в программе это имя символа сколь угодно много раз.

Имена локальных символов

Локальные символы помогают компилятоpам и пpогpаммистам использовать имена вpеменно. Есть десять имен локальных символов, котоpые многокpатно использyются по ходy пpогpаммы. Вы можете обpащаться к ним использyя имена `0', `1'... `9'. Чтобы опpеделить локальный символ, напишите меткy в виде 'N:' (где N является какойлибо цифрой). Для обращения к последнему предыдущему определению этого символа напишите 'Nb', используя ту же цифру, что и при описании метки. Для обращения к следующему определению локальной метки напишите 'Nf' - где N дает вам возможность выбрать из десяти следующих ссылок. 'b' является сокращением для "backwards", 'f' - для "foward".

Локальные символы не генерируются сyществyющим компилятоpом GNU C.

Hет никаких огpаничений на использование этих меток, но помните, что в любом слyчае вы можете обpащаться не более чем к 10 пpедыдyщим локальным меткам и не более чем к 10 последyющим.

Имена локальных символов не более чем запись. Они сpазy же тpансфоpмиpyются в более yдобные имена символов, пеpед тем как ассемблеp использyет их. Имена символов, хpанящиеся в таблице символов, появляющиеся в сообщениях об ошибках и возможно попадающие в объектный файл состоят из следyющих частей:

L

Все локальные метки начинаются с 'L'. Обычно as и ld забывают о символах, начинающихся с 'L'. Эти метки используются для символов, которые вы никогда не будете пытаться увидеть. Если вы используете опцию -L as сохраняет эти символы в объектном файле. Если вы также настроете ld для того, чтобы он оставлял эти символы, то Вы можете использовать их при отладке.

ЦИФРА

Если метка записана в виде `0:' то цифра - `0'.Если метка записана в виде `1:' то цифра - `1'. И так далее до 9.

^A

Этот необычный символ введен для того, что бы вы случайно не сделали символ с тем же именем. Код ASCII этого знака 001.

ПОРЯДКОВЫЙ НОМЕР

Это порядковый номер, позволяющий меткам быть различными. Первый '0:' получает номер 1, пятнадцатый - 15 и так далее. Аналогично для других меток от '1:' до '9:'

Например, первая '1:' получает имя `L1^A1', сорок четвертая `3:'-`L3^A44'.

5.4 Специальный cимвол Точка

Специальный символ '.' ссылается на текущий адрес, в который ассемблирует as. Так выражение `melvin:.long .' определяет `melvin' содержащим свой собственный адрес. Присваивание точке значения означает то же, что и директива .org. Так, выражение `.=.+4' означает тоже самое, что и `.space 4'.

5.5 Атрибуты Символа

Каждый символ имеет, кроме имени, атрибуты "Значение" и "Тип". В зависимости от выходного формата символы также могут иметь дополнительные атрибуты.

Если Вы используете символ не определяя его, то as считает все его атрибуты нулевыми, и вероятно не предупредит Вас. Это делает символ внешне определенным символом, что обычно Вам и нужно.

Значение

Значение символа (обычно) состоит из 32 бит. Для символа, который помечает место в секции text, data, bss или absolute, значение является количеством адресов от начала секции до метки. Обычно, для секций text, data и bss значение символа меняется, когда ld меняет базовый адрес секции во время линковки. Значения абсолютных символов остаются неизменными во время линковки: поэтому они и называются абсолютными.

Значения неопределенных символов определяется особым образом. Если такое значение 0, то символ не определен в данном исходном ассемблерном файле, и ld пытается определить его значение из других файлов, слинкованных в эту программу. Вы можете создать символ такого типа просто упомянув его имя и не определяя его. Ненулевое значение представляет описание общей области .comm. Значение равно тому, сколько байтов (адресов) должно быть зарезервировано. Символ относится к первому адресу зарезервированного пространства.

Тип

Атрибут типа символа содержит информацию о перемещении (секции), различные флаги, показывающие, что символ внешний, и (возможно) другую информацию для отладчиков и линкеров. Точный формат завит от используемого фоpмата объектного кода.

Атрибуты символа для формата `a.out'

Дескриптор

Это произвольное 16-битное значение. Вы можете установить дескриптор символа используя директиву .desc (смотрите раздел 7.12 [.desc]). Значение дескриптора ничего не означает для as.

Другие

Это произвольное 8-битное значение. Оно ничего не означает для as.

Атрибуты символа для формата COFF

Формат COFF поддерживает множество различных атрибутов символов; как и главные атрибуты символов они задаются между директивами .def и .endef.

Главные Атрибуты

Имя символа задается при помощи .def; значение и тип при помощи .val и .type соответственно.

Вспомогательные атрибуты

Директивы as .dim, .line, .scl, .size, и .tag могут формировать вспомогательную информацию в таблице символов для COFF.

Атрибуты Символов для SOM

Формат SOM для HPPA поддерживает множество атрибутов символов, устанавливаемых директивами .EXPORT и .IMPORT.

Атрибуты описаны в `HP9000 Series 800 Assembly Language Reference Manual' (HP 92432-90001) в документации ассемблерных директив `IMPORT' и `EXPORT'.


Вперед Назад Содержание