2.Синтаксис языка ассемблер. Алфавит языка, команды, директивы, комментарии. Правила написания идентификаторов, команд, меток, данных и т.д.
Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы.
Предложения ассемблера бывают четырех типов:
- команды или инструкции, представляющие собой символические аналоги машинных команд. В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд микропроцессора;
- макрокоманды - оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями;
- директивы, являющиеся указанием транслятору ассемблера на выполнение некоторых действий. У директив нет аналогов в машинном представлении;
- строки комментариев, содержащие любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором.
Предложения, составляющие программу, могут представлять собой синтаксическую конструкцию, соответствующую команде, макрокоманде, директиве или комментарию. Для того чтобы транслятор ассемблера мог распознать их, они должны формироваться по определенным синтаксическим правилам. Для этого лучше всего использовать формальное описание синтаксиса языка наподобие правил грамматики. Наиболее распространенные способы подобного описания языка программирования - синтаксические диаграммы и расширенные формы Бэкуса-Наура. Для практического использования более удобны синтаксические диаграммы. К примеру, синтаксис предложений ассемблера можно описать с помощью синтаксических диаграмм, показанных на следующих рисунках 10, 11, 12.
Символы языка ассемблера
Допустимыми символами при написании текста программ являются:
1) все латинские буквы: A-Z, a-z. При этом заглавные и строчные буквы считаются эквивалентными;
2) цифры от 0 до 9;
3) знаки ?, @, $, _, &;
4) разделители , . [ ] ( ) < > { } + / * % ! ‘ ” ? \ = # ^.
Предложения ассемблера формируются из лексем, представляющих собой синтаксически неразделимые последовательности допустимых символов языка, имеющие смысл для транслятора.
Лексемами являются:
1. идентификаторы - последовательности допустимых символов, использующиеся для обозначения таких объектов программы, как коды операций, имена переменных и названия меток. Правило записи идентификаторов заключается в следующем: идентификатор может состоять из одного или нескольких символов;
2. цепочки символов - последовательности символов, заключенные в одинарные или двойные кавычки;
3. целые числа в одной из следующих систем счисления: двоичной, десятичной, шестнадцатеричной. Отождествление чисел при записи их в программах на ассемблере производится по определенным правилам:
- десятичные числа не требуют для своего отождествления указания каких-либо дополнительных символов, например 25 или 139.
- для отождествления в исходном тексте программы двоичных чисел необходимо после записи нулей и единиц, входящих в их состав, поставить латинское “b”, например 10010101b.
- шестнадцатеричные числа имеют больше условностей при своей записи:
Во-первых, они состоят из цифр 0…9, строчных и прописных букв латинского алфавита a, b, c, d, e, f или A, B, C, D, E, F. Во-вторых, у транслятора могут возникнуть трудности с распознаванием шестнадцатеричных чисел из-за того, что они могут состоять как из одних цифр 0…9 (например, 190845), так и начинаться с буквы латинского алфавита (например, ef15). Для того чтобы “объяснить” транслятору, что данная лексема не является десятичным числом или идентификатором, программист должен специальным образом выделять шестнадцатеричное число. Для этого на конце последовательности шестнадцатеричных цифр, составляющих шестнадцатерич-ное число, записывают латинскую букву “h”. Это обязательное условие. Если шестнадцатеричное число начинается с буквы, то перед ним записывается ведущий ноль: 0ef15h.
Практически каждое предложение содержит описание объекта, над которым или при помощи которого выполняется некоторое действие. Эти объекты называются операндами. Их можно определить так: операнды - это объекты (некоторые значения, регистры или ячейки памяти), на которые действуют инструкции или директивы, либо это объекты, которые определяют или уточняют действие инструкций или директив.
Возможно, провести следующую классификацию операндов:
- постоянные или непосредственные операнды;
- адресные операнды;
- перемещаемые операнды;
- счетчик адреса;
- регистровый операнд;
- базовый и индексный операнды;
- структурные операнды;
- записи.
Операнды являются элементарными компонентами, из которых формируется часть машинной команды, обозначающая объекты, над которыми выполняется операция. В более общем случае операнды могут входить как составные части в более сложные образования, называемые выражениями.
Выражения представляют собой комбинации операндов и операторов, рассматриваемые как единое целое. Результатом вычисления выражения может быть адрес некоторой ячейки памяти или некоторое константное (абсолютное) значение.
Типы операторов ассемблера
Перечислим возможные типы операторов ассемблера и синтаксические правила формирования выражений ассемблера:
- арифметические операторы;
- операторы сдвига;
- операторы сравнения;
- логические операторы;
- индексный оператор;
- оператор переопределения типа;
- оператор переопределения сегмента;
- оператор именования типа структуры;
- оператор получения сегментной составляющей адреса выражения;
- оператор получения смещения выражения.