Символ - основное понятие: программист использует символы для именования различных сущностей, редактор связей (линкер) использует символы для связывания, отладчик использует символы в ходе отладки.
Предупреждение: as помещает символы не в том порядке, в котором они описаны. Это может быть несовместимо с некоторыми отладчиками.
Метка пишется как символ, за которым сразу следует двоеточие `:'. Этот символ представляет текущее значение активного счетчика места и является, например, подходящим операндом инструкции. Если вы используете один и тот же символ для пpедставления двyх pазличных мест, то пеpвое опpеделения пеpекрывает все остальные.
Hа HPPA обычная форма метки не требует наличия двоеточия; вместо этого метка должна начинаться с нулевой колонки. Только одна метка может быть определена в одной строке. Для того, чтобы обойти это ограничение, в версии as для HPPA предусмотрена директива .label для более гибкого определения меток.
Символу может быть придано любое значение написанием символа, за которым следует знак "=", а затем выражение (смотрите главу 6,"Выражения"). Это эквивалентно использованию директивы .set. Смотрите раздел 7.49[.set].
Имена символов начинаются с буквы или с одного из знаков '.' или '_'. На большинстве машин Вы можете также использовать '$' в именах символов, исключения смотрите в главе 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'. Обычно as и ld забывают о символах, начинающихся с 'L'. Эти метки используются для символов, которые вы никогда не будете пытаться увидеть. Если вы используете опцию -L as сохраняет эти символы в объектном файле. Если вы также настроете ld для того, чтобы он оставлял эти символы, то Вы можете использовать их при отладке.
Если метка записана в виде `0:' то цифра - `0'.Если метка записана в виде `1:' то цифра - `1'. И так далее до 9.
Этот необычный символ введен для того, что бы вы случайно не сделали символ с тем же именем. Код ASCII этого знака 001.
Это порядковый номер, позволяющий меткам быть различными. Первый '0:' получает номер 1, пятнадцатый - 15 и так далее. Аналогично для других меток от '1:' до '9:'
Специальный символ '.' ссылается на текущий адрес, в который ассемблирует as. Так выражение `melvin:.long .' определяет `melvin' содержащим свой собственный адрес. Присваивание точке значения означает то же, что и директива .org. Так, выражение `.=.+4' означает тоже самое, что и `.space 4'.
Каждый символ имеет, кроме имени, атрибуты "Значение" и "Тип". В зависимости от выходного формата символы также могут иметь дополнительные атрибуты.
Если Вы используете символ не определяя его, то as считает все его атрибуты нулевыми, и вероятно не предупредит Вас. Это делает символ внешне определенным символом, что обычно Вам и нужно.
Значение символа (обычно) состоит из 32 бит. Для символа, который помечает место в секции text, data, bss или absolute, значение является количеством адресов от начала секции до метки. Обычно, для секций text, data и bss значение символа меняется, когда ld меняет базовый адрес секции во время линковки. Значения абсолютных символов остаются неизменными во время линковки: поэтому они и называются абсолютными.
Значения неопределенных символов определяется особым образом. Если такое значение 0, то символ не определен в данном исходном ассемблерном файле, и ld пытается определить его значение из других файлов, слинкованных в эту программу. Вы можете создать символ такого типа просто упомянув его имя и не определяя его. Ненулевое значение представляет описание общей области .comm. Значение равно тому, сколько байтов (адресов) должно быть зарезервировано. Символ относится к первому адресу зарезервированного пространства.
Атрибут типа символа содержит информацию о перемещении (секции), различные флаги, показывающие, что символ внешний, и (возможно) другую информацию для отладчиков и линкеров. Точный формат завит от используемого фоpмата объектного кода.
Это произвольное 16-битное значение. Вы можете установить дескриптор символа используя директиву .desc (смотрите раздел 7.12 [.desc]). Значение дескриптора ничего не означает для as.
Это произвольное 8-битное значение. Оно ничего не означает для as.
Формат COFF поддерживает множество различных атрибутов символов; как и главные атрибуты символов они задаются между директивами .def и .endef.
Имя символа задается при помощи .def; значение и тип при помощи .val и .type соответственно.
Директивы as .dim, .line, .scl, .size, и .tag могут формировать вспомогательную информацию в таблице символов для COFF.
Формат SOM для HPPA поддерживает множество атрибутов символов, устанавливаемых директивами .EXPORT и .IMPORT.
Атрибуты описаны в `HP9000 Series 800 Assembly Language Reference Manual' (HP 92432-90001) в документации ассемблерных директив `IMPORT' и `EXPORT'.