Синтаксис ассемблера

Программа на ассемблере представляет собой совокупность блоков памяти, назы­ваемых сегментами. Программа может состоять из одного или нескольких таких блоков-сегментов. Сегменты программы имеют определенное назначение, соответ­ствующее типу сегментов: кода, данных и стека. Названия типов сегментов отра­жают их назначение. Деление программы на сегменты отражает сегментную орга­низацию памяти процессоров Intel (архитектура IA-32). Каждый сегмент состоит из совокупности отдельных строк, в терминах теории компиляции называемых предложениями языка. Для языка ассемблера предложения, составляющие программу,могут представлять собой синтаксические конструкции четырех типов.

§ Команды (инструкции) представляют собой символические аналоги машинных команд. В процессе трансляции инструкции ассемблера преобразуются в соот­ветствующие команды системы команд процессора.

o Макрокоманды — это оформляемые определенным образом предложения тек­ста программы, замещаемые во время трансляции другими предложениями.

o Директивы являются указанием транслятору ассемблера на выполнение неко­торых действий. У директив нет аналогов в машинном представлении.

o Комментарии содержат любые символы, в том числе и буквы русского алфави­та. Комментарии игнорируются транслятором.

Для распознавания транслятором ассемблера этих предложении их нужно фор­мировать по определенным синтаксическим правилам. Для формального описа­ния синтаксиса языков программирования используются различные метасинтаксические языки, которые представляют собой совокупность условных знаков, образующих нотацию метасинтаксического языка, иправил формирования из этих знаков однозначных описаний синтаксических конструкцийцелевого языка.

В учебных целях удобно использовать два метасинтаксических языка — син­таксические диаграммы и нормальные формы Бэкуса-Наура. Оба этих языка,в ко­нечном итоге, предоставляют одинаковый объем информации. Поэтому выбор кон­кретного языка может определяться исходя из того, что синтаксические диаграммы более наглядны, арасширенные формы Бэкуса-Наура более компактны. В учебнике будут использоваться оба способа.

На рис. 5.1,5.2 и 5.3 показан порядок написания предложений ассемблера с по­мощью синтаксических диаграмм.

Как использовать синтаксические диаграммы? Очень просто: для этого нужно всего лишь найти и затем пройти путь от входа диаграммы (слева) к ее выходу (направо). Если такой путь существует, то предложение или конструкция являют­ся синтаксически правильными. Если такого пути нет, значит, эту конструкцию компилятор не примет. Иногда на линиях в синтаксических диаграммах присут­ствуют стрелки. Они говорят о том, что необходимо обратить внимание на на­правление обхода, указываемое этими стрелками, так как среди путей могут быть и такие, по которым можно идти справа налево.

По сути, синтаксические диаграм­мы отражают логику работы транслятора при разборе входных предложений про­граммы. Далее перечислены термины, представленные на рисунках.

Ими метки — символьный идентификатор. Значением данного идентификатора является адрес первого байта предложения программы, которому он пред­шествует.

Префикс — символическое обозначение элемента машинной команды, предна­значенного для изменения стандартного действия следующей за ним команды ассемблера (см. главу 3).

Имя — идентификатор, отличающий данную директиву от других одноимен­ных директив. В зависимости от конкретной директивы в результате обработ­ки ассемблером этому имени могут бытьприсвоены определенные характери­стики.

Код операции (КОП) и директива — это мнемонические обозначения соответствующей машиннойкоманды, макрокоманды или директивы транслятора.

Операнды — части команды, макрокоманды или директивы ассемблера, обозна­чающие объекты, над которыми производятся действия. Операнды ассемблера описываются выражениями с числовыми и текстовыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов.

Другой способ описания синтаксиса языка — нормальные (расширенные) фор­мы Бэкуса-Наура. С помощью форм Бэкуса-Наура целевой язык представляется в виде объектов трех типов.

· Основные символы языка, в теории компиляции, называемые терминальными, — это имена операторов, регистров и т. п., то есть это те символьные объекты, из которых строится, в частности, исходный текст ассемблерной программы.

· Имена конструкции языка, в теории, называемые нетерминальными символа­ми, обычно заключаются в угловые скобки <> или пишутся строчными бук­вами.

· Правила (формы) описывают порядок формирования конструкций, в том чис­ле предложений, целевого языка.

Каждая форма состоит из трех частей — левой, правой и связки:

левая часть — всегда нетерминальный символ, который обозначает одну из кон­струкций языка;

связка — символ стрелки =>, который можно трактовать как словосочетание «определяется как»;

правая часть описывает один или несколько вариантов построения конструк­ции, определяемой левой частью.

Несколько форм Бэкуса-Наура могут быть связаны между собой по нетерми­нальным символам, то есть одна форма определяется через другую. Для построе­ния конструкции целевого языка необходимо взять одну или несколько форм Бэкуса-Наура, в каждой из которых выбрать нужный вариант для подстановки. В конечном итоге должна получиться конструкция (предложение) целевого язы­ка, состоящая только из терминальных символов.

Для примера рассмотрим описание и использование форм Бэкуса-Наура для построения десятичных чисел со знаком. Вначале опишем эти формы (правила):

<десятичное_знаковое_целое>=><число_без_знака>|+<число_без_знака>| <число_без_знака><число_без_знака>=><десятичная_цифра>|<число_без_знака><десятичная_цифра>< десятичная_цифра > =>0|l|2|3|d|5|6|7]8|9

Здесь:

§ <десятичное_знаковое_целое>=><число_без_знака><дес_цифра> —нетерминальные символы (в исходной программе на ассемблере таких объектов нет);

§ +|-|0|1|2|3|4|5|б|7|8|9— терминальные символы (их можно найти в исходном тексте программы), из терминальных символов по приведенным ранее трем пра­вилам строится любое десятичное число;

§ символ вертикальной черты (|) означает альтернативу при выборе варианта некоторого правила.

Для примера выведем число -501, используя формы Бэкуса-Наура:

<десятичное_знаковое_целое> => <число_без_знака> => <число_без_знака><дес_цифра> => <число_без_знака>1 =» <число_без_знака><дес_цифра>1 <число_6ез_знака>01» <дес_цифра>01 => 501

Предложения ассемблера (см. рис. 5.1-5.3) формируются из лексем, представ­ляющих собой синтаксически неразделимые последовательности допустимых символов языка, имеющие смысл для транслятора.

Вначале определим алфавит ассемблера, то есть допустимые для написания текста программ символы:

· АSII_символ_буква — все латинские буквы А - Z, а - z, причем прописные и строчные буквы считаются эквивалентными;

· decdigit — цифры от 0 до 9;

· специальные знаки _,?, @, $,&;

· разделители: „., [, ], (,), <, >, {, }, +, /, *, %,!,",",?, \, =, #.

Лексемами языка ассемблера являются ключевые слова, идентификаторы, це­почки символов и целые числа.

1. Ключевые слова — это служебные символы языка ассемблера. По умолчанию регистр символов ключевых слов не имеет значения. К ключевым словам от­носятся:

o названия регистров (AL, АН, BL, BH, CL. CH, DL, DH, АХ, ЕАХ, ВХ, ЕВХ, СХ. ЕСХ, DX, EDX, ВР, ЕВР, SР, ESP. DI. EDI, SI, ESI, CS, DS. ES, FS, G5, SS, CRO, CR2, CR3, DRO, DR1, DR2, DR3, DR6, DR7);

o операторы (BYTE, SBYTE, WORD, SWORD, DWORD, SDWORD, FWORD, QWORD, TBYTE, REAL4, REAL8, REAL10, NEAR16, NEAR32, FAR16, FAR32, AND, NOT, HIGH, LOW, HIGHWORD,LOWWORD, OFFSET, SEG, LROFFSET, TYPE, THIS, PTR, WIDTH, MASK, SIZE, SIZEOF, LENGTH,LENGTHOF, ST, SHORT, TYPE. OPATTR, MOD, NEAR, FAR, OR, XOR, EQ, NE, LT, LE. GT, GE. SHR и др.);

o названия команд (КОП) ассемблера, префиксов.

2. Идентификаторы — последовательности допустимых символов, использующие­ся для обозначения имен переменных и меток. Правило записи идентификаторов можно описать следующими формами Бэкуса-Наура:

<id> => АSCII_символ_буква | АSCII_символ_буква |<id> АCCII_символ_буква | <id> <decdigit> | <znak> <decdigit> <id> | <znak> <id> <decdigit> => 0|1|2|3|4|5|6|7|819

<znak> => _|?|@|$|_|&

Приведенные формы говорят о том, что идентификатор может состоять из од­ного или нескольких символов. В качестве символов можно использовать буквы латинского алфавита, цифры и некоторые специальные знаки — _,?, $, @. Иденти­фикатор не может начинаться символом цифры. Длина идентификатора может составлять до 255 символов (247 в MASM), хотя транслятор воспринимает лишь первые 32, а остальные игнорирует. Регулировать длину возможных идентифика­торов (в TASM) можно с использованием ключа командной строки /mw. Кроме того, существует возможность указать транслятору на необходимость различать прописные и строчные буквы либо игнорировать их различие (что и делается по умолчанию). Для этого (в TASM) применяются ключи командной строки /mu,/ml, /mx (см. приложение В на сайте https://www.piter.com/download).

3. Цепочки символов — это последовательности символов, заключенные в одинарные или двойные кавычки.

Правила формирования:

<string> => <quote> [[ <stext> ]] <quote>

<stext> =><StringChar> | <stext> <stringCnar>

<stringChar> => <quote> <quote> любой символ кроме кавычки

<quote>=>" | '

Целые числа могут указываться в двоичной, десятичной или шестнадцатеричной системах счисления. Отождествление чисел при записи их в программах на ассемблере производится по определенным правилам. Десятичные числа не тре­буют для своего отождествления указания каких-либо дополнительных символов.Для отождествления в исходном тексте программы двоичных и шестнадцатеричныхчисел используются следующие правила:

<шестнадц_число> => <дес_шестнадц_число>h | 0<сим_шестнадц_число> h

<дес_шестнадц_число> => <decdigit.><сим_шестнадц_число> |<decdigit>

<сим_шестнадц_число> =>

<hexdigit><сим_шестнадц_число>|<дес_шестнадц_число>|<decdigit>|<hexdigit>

<decdigit> => 0|l|2I3|4|5I6|7|8|9

<hexdigit> => a|b|c|d|e|f|A|B|C|D|E|F

Важно отметить наличие символов после (h) и перед (0) записью шестнадцатеричного числа. Это сделано для того, чтобы транслятор мог отличить в программеодинаковые по форме записи десятичные и шестнадцатеричные числа. К примеру, числа 1578 и 1578h выглядят одинаково, но имеют разные значения. С другой сто­роны,какое значение в тексте исходной программы может иметь лексема fe023? Это может быть инекоторый идентификатор, и, судя по набору символов, шестнадцатеричное число. Для того чтобы однозначно описать в тексте программы на ассемблере шестнадцатеричное число, начинающееся с буквы, его дополняют ве­дущим нулем «0» и в конце ставят символ «h».

Для данного примера правильная запись шестнадцатеричного числа — 0fe023h:

<двоичн_число> => <bindigit>b|<bindigit><двоичн_число> b

|<bindigit> => 0|1

Для двоичных чисел все просто — после записи нулей и единиц, входящих в их состав, необходимо поставить латинскую букву «b».

Пример: 10010101b

Рассуждениями, приведенными ранее, был показан порядок формирования предложений программы ассемблера и составляющих их элементов (лексем). Так­же были рассмотрены правила формирования меток, названий команд (префик­сов).

Осталось обсудить комментарии и операнды. Что касается комментария, то это самый простой элемент предложения ассемблера. Любая комбинация симво­лов ASCII, расположенная в строке за символом точки с запятой (;) транслятором игнорируется, то есть является комментарием (см. рис. 5.1-5.3). Описанию опе­рандов, ввиду их важности, будет посвящен отдельный подраздел.

Контрольные вопросы

1. Сегмент – определение, назначение;

2. Три типа сегментов?

3. Четыре типа предложений языка?

4. Два метасинтаксических языка – их различие?

5. Три формата синтаксических диаграмм?

6. Термины, применяемые в синтаксических диаграммах?

7. Три типа объектов форм Бэкуса-Наура?

8. Три части формы языка?

9. Четыре составные части алфавита ассемблера?

10. Лексема – определение, лексемами языка ассемблера являются….?

11. Что относится к ключевым словам ассемблера?

12. Идентификаторы – определение, ограничения в написании идентификатора, длина идентификатора, примеры;

13. Цепочки символов – определение, пример;

14. Целые числамогут указываться….?

15. Целые числа – правила отождествления в исходном тексте программы двоичных и шестнадцатеричных чисел, примеры?

16. Представление в программе двоичных чисел, пример?

17. Комментарии – представление в программе, пример?



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  




Подборка статей по вашей теме: