Локальные символы помогают компилято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'.
Специальный cимвол Точка
Специальный символ '.' ссылается на текущий адрес, в который ассемблирует as. Так выражение `melvin:.long.' определяет `melvin' содержащим свой собственный адрес. Присваивание точке значения означает то же, что и директива.org. Так, выражение `.=.+4' означает тоже самое, что и `.space 4'.
Атрибуты Символа
Каждый символ имеет, кроме имени, атрибуты "Значение" и "Тип". В зависимости от выходного формата символы также могут иметь дополнительные атрибуты.
Если Вы используете символ не определяя его, то as считает все его атрибуты нулевыми, и вероятно не предупредит Вас. Это делает символ внешне определенным символом, что обычно Вам и нужно.
Значение
Значение символа (обычно) состоит из 32 бит. Для символа, который помечает место в секции text, data, bss или absolute, значение является количеством адресов от начала секции до метки. Обычно, для секций text, data и bss значение символа меняется, когда ld меняет базовый адрес секции во время линковки. Значения абсолютных символов остаются неизменными во время линковки: поэтому они и называются абсолютными.
Значения неопределенных символов определяется особым образом. Если такое значение 0, то символ не определен в данном исходном ассемблерном файле, и ld пытается определить его значение из других файлов, слинкованных в эту программу. Вы можете создать символ такого типа просто упомянув его имя и не определяя его. Ненулевое значение представляет описание общей области.comm. Значение равно тому, сколько байтов (адресов) должно быть зарезервировано. Символ относится к первому адресу зарезервированного пространства.
|
Тип
Атрибут типа символа содержит информацию о перемещении (секции), различные флаги, показывающие, что символ внешний, и (возможно) другую информацию для отладчиков и линкеров. Точный формат завит от используемого фоpмата объектного кода.
Выражения
Выражение определяет адрес или числовое значение. Пропуски могут предшествовать и/или следовать за выражением.
Результат выражения должен быть абсолютным числом или смещением в определенной секции. Если выражение не является абсолютным, и нет достаточной информации для as при анализе выражения, чтобы найти его секцию, то для интерпретации выражения необходим второй проход. В настоящеевремя второй проход не предусмотрен. As в этой ситуации прекращает работу и выдает сообшение об ошибке.
Пустые Выражения
Любое пустое выражение не имеет значения: это просто пропуск или null. Где бы не было нужно абсолютное выражение, вы можете опустить выражение и as поставит вместо него 0. Это совместимо с другими ассемблерами.
Целые Выражения
Целое выражение - это один или более аргументов, разделенных операторами.
Аргументы
Аргументы - это символы, числа и подвыражения. В других контекстах аргументы часто называются "арифметическими операндами". В этом руководстве, чтобы избежать конфликтов с "операндами инструкций" машинного языка, мы используем термин "аргумент" только по отношению к частям выражений, резервируя слово "операнд" для операндов машинных инструкций.
|
Символы вычисляются в виде {SECTION NNN}, где SECTION одна из text, data, bss, absolute, или undefined. NNN есть 32-х битное целое число со знаком в двоичном дополнительном коде.
Числа обычно целые.
Число может быть с плавающей точкой или большим целым. В этом случае Вам выдается предупреждение, что используются только 32 младших разряда, и as считает, что эти 32 бита представляют собой целое. Вы можете писать целочисленные инструкции, работающие с экзотическими константами, совместимые с другими ассемблерами.
Подвыpажения-это левая скобка `(', за котоpой следyет целочисленное выpажение, а затем идет пpавая скобка `)', либо это опеpатоp пpефикса, за котоpым идет аpгyмент.
Опеpатоpы
Опеpатоpы - это аpифметические фyнкции, такие как '+' или '-'. За префиксными операторами следует аргумент. Инфикснные операторы ставятся между аргументами. Перед и/или после оператора могут быть пропуски.
Префиксные Операторы
As имеет следующие префиксные операторы. Каждый из них имеет один аргумент, который должен быть абсолютным.
-
"Отрицание". Двоичное дополнительное отрицание.
~
"Дополнение". Двоичное не.
Инфиксные Операторы
Инфиксные операторы имеют два аргумента, по одному с каждой стороны. Операторы имеют приоритет, но операции с равным приоритетом выполняются слева направо. Кроме случаев '+' и '-', оба аргумента должны быть абсолютными и результат получается так же абсолютным.
- Высший Приоритет
*
"Умножение".
/
"Деление". Округление такое же, как и у оператора '/' языка C.
%
"Остаток".
<
<<
"Сдвиг влево". То же, что и оператор << языка C.
>
>>
"Сдвиг вправо". То же, что и оператор >> языка C.
- Средний приоритет.
|
"Побитовое Или".
&
"Побитовое И".
^
"Побитовое Исключающее Или".
!
"Побитовое Или-Не".
- Низший Приоритет
+
"Сложение". Если один из аргументов абсолютен, то результат относится к секции другого аргумента. Вы не можете складывать аргументы из различных секций.
-
"Вычитание". Если правй аргумент абсолютен, результат относится к секции левого аргумента. Если оба аргумента из одной секции, то результат абсолютный. Вы не можете вычитать аргументы из разных секций.
Вкратце, имеет смысл складывать и прибавлять только смещения адреса; Вы должны иметь определенную секцию в одном из аргументов.
Ассемблерные директивы
Все ассемблерные директивы имеют имена, начинающиеся с точки (`.'). Остальная часть имени пишется буквами, обычно строчными.
В этой главе для ознакомления перечислены лишь некоторые директивы, доступные в as для архитектуры NMC. Полный список директив и их описание можно найти в документации as на сайте разработчиков sourceware.org/binutils/docs-2.24/as/index.html.
.ascii "СТРОКА"
.ascii ожидает ноль или более строковых литералов (смотрите раздел 3.6.1.1 Строки), отделенных запятыми. Эта директива ассемблирует каждую строку (без автоматической подстановки нулевого байта в конец строки) в последовательные адреса памяти.
Data ПОДСЕКЦИЯ
.data указывает, что as должен ассемблировать последующие операторы в конец подсекции data с номером ПОДСЕКЦИЯ (который является абсолютным выражением). Если ПОДСЕКЦИЯ опущена, то по умолчанию предполагается ноль.