Синтаксис ассемблера
В этой главе описываются основные лексические элементы программирования ассемблера и объясняет, как те элементы объединяются для формирования полных выражений ассемблера.
Эта глава продолжает объяснять, как последовательности выражений соединены для формирования операторов, составляющих программу на языке ассемблера.
Элементы ассемблера
В этом разделе описываются основные стандартные блоки программы на языке ассемблера — это символы, символы, метки и константы.
Символы
Следующие символы используются в программах на языке ассемблера:
Алфавитно-цифровые символы — через Z, через z, и 0 до 9
Другие печатаемые символы ASCII (такой как
#
, $:., +, - *,/!, и |)Непечатаемые символы ASCII (такие как пространство, вкладка, возврат и новая строка)
Некоторые из этих символов имеют особые значения, описанные в Синтаксисе выражения и в Операторах Ассемблера.
Идентификаторы
Идентификатор (также известный как символ) может использоваться в нескольких целях:
Как метка для ассемблерного оператора (см. Метки),
Как тег расположения для данных
Как символьное имя константы
Каждый идентификатор состоит из последовательности алфавитно-цифровых символов (который может включать другие печатаемые символы ASCII такой как .
, _
, и $
). Первый символ не должен быть числовым. Идентификаторы могут иметь любую длину, и все символы являются значительными. Регистр букв является значительным — например, идентификатор var
отличается от идентификатора Var
.
Также возможно определить идентификатор путем включения многократных идентификаторов в паре двойных кавычек. Например:
"Object +new:": |
.long "Object +new:" |
Метки
Метка записана как идентификатор, сразу сопровождаемый двоеточием (:
). Метка представляет текущую стоимость текущего счетчика адреса; это может использоваться в ассемблерных инструкциях в качестве операнда.
Числовые метки
Локальные числовые метки позволяют компиляторам и программистам использовать имена временно. Числовая метка состоит из цифры (между 0 и 9) сопровождаемый двоеточием. Эти 10 локальных имен символа могут быть снова использованы любое число раз всюду по программе. Как с алфавитно-цифровыми метками, числовая метка присваивает текущую стоимость счетчика адреса к символу.
Несмотря на то, что многократные числовые метки с той же цифрой могут использоваться в той же программе, только на следующее определение и новое предыдущее определение метки можно сослаться:
Для обращения к новому предыдущему определению локальной числовой метки запишите цифру
b
, (использование той же цифры как тогда, когда Вы определили метку).Для обращения к следующему определению числовой метки запишите цифру
f
.
Объем метки
Объем метки является расстоянием, по которому это видимо к (и referenceable), другие части программы. Обычно, метка, тегирующая расположение или данные, видима только в текущем компоновочном блоке.
.globl
директива (описанный в .globl) может использоваться для создания метки внешней. В этом случае символ видим к другим компоновочным блокам во время ссылки.
Константы
Четыре типа констант доступны: Числовой, символ, строка и плавающая точка. Все константы интерпретируются как абсолютные количества, когда они появляются в выражении.
Числовые константы
Числовая константа является маркером, запускающимся с цифры. Числовые константы могут быть десятичными, шестнадцатеричными, или восьмеричными. Следующие ограничения применяются:
Десятичные константы содержат только цифры между 0 и 9, и обычно не более длинны, чем 32 бита — наличие значения между
-2,147,483,648
и2,147,483,647
(значения, не помещающиеся в 32 бита, являются сверхбольшими числами, которые законны, но которые должны соответствовать в заданном формате). Десятичные константы не могут содержать начальные нули или запятые.Шестнадцатеричные константы запускаются с
0x
(или0X
), сопровождаемый между одной и восемью десятичными или шестнадцатеричными цифрами (0
через9
,a
черезf
, иA
черезF
). Значения, не помещающиеся в 32 бита, являются сверхбольшими числами.Восьмеричные константы запускаются с
0
, сопровождаемый от одной до одиннадцати восьмеричных цифр (0 до 7). Значения, не помещающиеся в 32 бита, являются сверхбольшими числами.
Символьные константы
Постоянный отдельный символ состоит из единственной кавычки ('
) сопровождаемый любым символом ASCII. Значение константы является кодом для данного символа.
Строковые константы
Строковая константа является последовательностью нуля или большего количества символов ASCII, окруженных кавычками (например, "a string"
).
Константы с плавающей точкой
Общая лексическая форма числа с плавающей точкой:
0flt_char[{+–}]dec...[.][dec...][exp_char[{+–}][dec...]] |
где:
Элемент | Описание |
---|---|
flt_char | Требуемый символ спецификации типа (см. следующую таблицу). |
[{+-}] | Дополнительное возникновение также |
декабрь.. | Требуемая последовательность одной или более десятичных цифр. |
[.] | Единственный дополнительный период. |
[декабрь..] | Дополнительная последовательность одной или более десятичных цифр. |
[exp_char] | Дополнительный символ-разделитель экспоненты (см. следующую таблицу). |
Символ спецификации типа, flt_char, указывает тип и представление созданного числа; набор юридических символов спецификации типа с архитектурой процессора, как показано здесь:
Архитектура | flt_char | exp_char |
---|---|---|
PPC | {dDfF} | {исключая ошибки} |
i386 | {fFdDxX} | {исключая ошибки} |
Когда константы с плавающей точкой используются в качестве параметров .single
и .double
директивы, символ спецификации типа фактически не используется в определении типа числа. Для удобства, r
или R
может использоваться последовательно для указания всех типов чисел с плавающей точкой.
Коллективно, все числа с плавающей точкой, вместе с квадратическими и восьмеричными скалярами, вызывают сверхбольшими числами. Когда as
требует сверхбольшого числа, 32-разрядный скаляр может также использоваться.
Константы с плавающей точкой внутренне представлены как flonums в машинно-независимом, независимом от точности формате с плавающей точкой (для точного перекрестного блока).
Счетчик сборного пункта
Единственный период (.
), обычно называемый «точкой», используется для представления текущего счетчика адреса. Нет никакого способа явно сослаться на любые другие счетчики адреса помимо текущего счетчика адреса.
Даже если это происходит в поле операнда оператора, точка относится к адресу первого байта того оператора; значение точки не обновляется до следующей машинной команды или ассемблерной директивы.
Синтаксис выражения
Выражения являются комбинациями условий операнда (который может быть числовыми константами или символьными идентификаторами), и операторы. Этот раздел перечисляет доступных операторов и описывает правила для объединения этих операторов с операндами для создания юридических выражений.
Операторы
Идентификаторы и числовые константы могут быть объединены, с помощью операторов, для формирования выражений. Каждый оператор воздействует на 64-разрядные значения. Если значение срока занимает меньше чем 64 бита, оно расширяется до знака на 64-разрядное значение.
Ассемблер обеспечивает и унарные операторы и бинарных операторов. Унарный оператор предшествует своему операнду; бинарный оператор следует за своим первым операндом и предшествует его второму операнду. Например:
!var | unary expression |
var+5 | binary expression |
Ассемблер распознает следующие унарные операторы:
Оператор | Описание |
---|---|
| Унарный минус: результатом является дополнение two операнда. |
| Поразрядное дополнение до единицы: результатом является поразрядное дополнение до единицы операнда. |
| Логическое отрицание: Если операнд является ненулевым, и, результатом является нуль |
Ассемблер распознает следующих бинарных операторов:
Оператор | Описание |
---|---|
| Дополнение: результатом является арифметическое добавление этих двух операндов. |
| Вычитание: результатом является арифметическое вычитание этих двух операндов. |
| Умножение: результатом является арифметическое умножение этих двух операндов. |
| Подразделение: результатом является арифметическое подразделение этих двух операндов; это - целочисленное деление, усекающее по направлению к нулю. |
| Модуль: результатом является остаток, это производится, когда первый операнд разделен на второе (этот оператор применяется только к интегральным операндам). |
| Сдвиг вправо: результатом является значение первого операнда, смещенного вправо, где второй операнд указывает число позиций двоичного разряда, на которые первый операнд должен быть смещен (этот оператор применяется только к интегральным операндам). Это всегда - арифметический сдвиг, так как все операторы воздействуют на операнды со знаком. |
| Сдвиг влево: результатом является значение первого операнда, смещенного налево, где второй операнд указывает число позиций двоичного разряда, на которые первый операнд должен быть смещен (этот оператор применяется только к интегральным операндам). |
| Поразрядный AND: результатом является поразрядная функция И этих двух операндов (этот оператор применяется только к интегральным операндам). |
| Битовое исключающее «ИЛИ»: результатом является функция битового исключающего «ИЛИ» этих двух операндов (этот оператор применяется только к интегральным операндам). |
| Поразрядно содержащий OR: результатом является поразрядная содержащая функция OR этих двух операндов (этот оператор применяется только к интегральным операндам). |
| Меньше, чем: результат |
| Больше, чем: результат |
| Меньше чем или равный: результат |
| Больше, чем или равный: результат |
| Равный: результат |
| Не равный (то же как |
Условия
Срок является частью выражения; это может быть:
Идентификатор.
Числовая константа (ее 32-разрядное значение используется). Счетчик сборного пункта (
.
), например, допустимая числовая константа.Выражение или срок включаются в круглые скобки. Любое количество, включенное в круглые скобки, оценено перед остальной частью выражения. Это может использоваться, чтобы изменить нормальную оценку выражений — например, дифференцироваться между
x * y + z
иx * (y + z)
или применять унарный оператор ко всему выражению — например,–(x * y + z)
.Срок, которому предшествует унарный оператор (например,
~var
). Многократные унарные операторы могут использоваться в сроке (например,!~var
).
Выражения
Выражения являются комбинациями условий, объединенных бинарными операторами. Выражение всегда оценивается к 32-разрядному значению, но в некоторых ситуациях используется различное значение:
Если операнд требует 1-байтового значения (a
.byte
директива, например), младший разряд 8 битов выражения используются.Если операнд требует 16-разрядного значения (a
.short
директива или amovem
инструкция, например), младший разряд 16 битов выражения используются.
Все выражения оценены с помощью тех же правил приоритета оператора, использующихся языком программирования C.
Когда выражение оценено, его значение абсолютное, перемещаемым, или внешним, как описано ниже.
Абсолютные выражения
Если его значение фиксируется, выражение является абсолютным. Следующее является примерами абсолютных выражений:
Выражение, условия которого являются константами
Идентификатор, значение которого является константой через прямой оператор присваивания
Значения те, к который
.set
директива применяется
Переместимые выражения
Выражение (или срок) перемещаемо, если его значение фиксируется относительно базового адреса, но имеет значение смещения, когда это соединяется или загружается в память. Например, все метки программы, определенной в перемещаемых разделах, перемещаемы.
Выражения, содержащие перемещаемые условия, должны добавить или вычесть только константы к своему значению. Например, принятие идентификаторов var
и dat
определяются в перемещаемом разделе программы, следующие примеры демонстрируют использование переместимых выражений:
Выражение | Описание |
---|---|
| Простой перемещаемый срок. Его значение является смещением от базового адреса текущего раздела управления. |
| Простое переместимое выражение. Начиная со значения |
| Не перемещаемый. Умножение перемещаемого срока константой лишает законной силы перемещаемое состояние выражения. |
| Не перемещаемый. Выражение не может быть соединено путем добавления |
| Переместимое выражение, если оба |
Внешние выражения
Выражение является внешним (или глобальная переменная), если это содержит внешний идентификатор, не определенный в текущей программе. В целом те же ограничения на выражения, содержащие перемещаемые идентификаторы, применяются к выражениям, содержащим внешние идентификаторы. Исключение то, что выражение var–dat
является неправильным когда оба var
и dat
внешние идентификаторы (т.е. Вы не можете вычесть два внешних переместимых выражения). Кроме того, Вы не можете умножить или разделить любое переместимое выражение.