Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Алгоритм работы макропроцессора





Для работы макроассемблера в основном составе работы ассемблера необходимы следующие структуры данных:

ТИМ – таблица имен макросов

Имя макроса Указатель на начало макроса в ТМО Указатель на конец макроса в ТМО

ТМО – таблица макроопределений

№ стр Строка макроса

Таблица параметров – выдает имя макроса, способ задания параметров: ключевой, позиционный или без параметров, имя параметров и их значения при вызове макроса.

Таблица переменных среды с переменными Р1,Р2,Р3, которые используются внутри макроса, изменяясь специальной командой SETF.

Таблица Операций содержит команды нашего языка ассемблера.

 

Алгоритм работы:

Входной файл анализируется построчно следующим образом:

1. Если в строке в поле МКОП встретилась директива ‘MACRO’, то переходим в режим макроопределения.

2. Если в строке в поле МКОП встретилась директива, не совпадающая с командами базового языка, зарезервированными словами и метками, она считается вызовом макроса. Переходим в режим макрогенерации, если макрос уже определен, т.е. присутствует в ТИМ, или заносим макрос в таблицу вызовов макросов для еще не определенных макросов.

3. Если в строке встретилась инструкция базового языка, переносим строку в конечный код без изменения.

4. Если внутри макроса в поле метки встретилась метка, начинающаяся с %, она принимается за метку ассемблера, в противном случае выдается ошибка о невозможности использования меток внутри макроса.

 

Режим макроопределения включает в себя:

1. Проверка строки макроопределения на правильность формирования, проверка имени макроса.

2. Рекурсивный вызов процедуры

А. Если встретилась директива ‘MACRO’ и уровень вложенности 1, записываем в ТИМ имя макроса с проверкой на уникальность, переписываем строку с макро и параметрами макроса в ТМО и заносим номер строки начала в ТИМ. Если уровень вложенности 2 и более просто переносим строку в ТМО.

Б. Если встретилась директива ‘MEND’, переносим строку в ТМО. В ТИМ находим последний неоконченный макрос и записываем в него строку конца из ТМО. Если уровень вложенности 1, выходим из режима макроопределения.

В. Если встретилась инструкция базового языка, то она заносится в ТМО.

 

Режим макрогенерации включает в себя:

1. Проверка имени вызова макроса на совпадение с уже введенными метками, зарезервированными словами, переменными среды, регистрами и пр. Если произошло совпадение – генерируется ошибка.

2. Поиск макроса в ТИМ.

А. Если макрос есть в ТИМ – подстановка макроса из ТМО.

Б. Если макроса еще нет в ТИМ, осуществляется запись имени макроса в таблицу вызовов и запись строки вызова макроса.

3. Если уровень вложенности 2ой – происходит запись вложенного макроса в ТИМ. 1ый – подстановка тела макроса.

4. При подстановке тела макроса происходит анализ параметров и директив.

 

 

Анализ параметров включает в себя:

1. Если при определении параметров или при их вызове встречается знак «=», способ задания считается ключевым, т.е. значение может быть передано параметру по его имени, т.е. ключу.

2. Если параметры заданы при вызове, но не заданы при определении – генерируется ошибка.

3. Если знака «=» нет, способ задания считается позиционным, т.е. значения задаются по позиции, заданной при определении макроса. Здесь количество параметров при описании и вызове должны совпадать (точное количество запятых).

4. Если параметры не заданы ни при определении, ни при вызове, макрос считается заданным без параметров, и все встретившие внутри операнды будут считаться символическими именами.

5. Если при вызове макроса некоторым параметрам не присвоены значения и эти параметры не используются в теле макроса, параметры просто считаются неопределенными, в противном случае генерируется ошибка.

6. Если параметр необходимо задать в виде числа, оно должно начинаться со знака «*».

 

Анализ директивы WHILE включает в себя:

1. Сохранение точки возврата, т.е. строки ТМО, в которой встретилась директива, сохранение начального значения переменной среды, использующегося в условии WHILE на момент входа в цикл, сохранение знака условия и его выполнимость.

2. Если встречается инструкция базового языка, то если условие выполняется, то строка переписывается в выходной файл.

3. Если встречается команда ESLI, то происходит изменение соответствующей переменной среды.

4. Если встречается директива ENDW, проверяется как изменилась переменная среды внутри цикла: если есть вероятность зацикливания – генерируется ошибка, в противном случае восстанавливается точка возврата, т.е мы снова обращаемся к строке WHILE.

5. Процедура обрабатывает строки рекурсивно, возможна обработка вложенных WHILE. Цикл закончится при невыполнении условия.

 

Анализ директивы IF включает в себя:

1. Сохранение знака условия и его выполнимость, встречалась ли уже директива ELSE.

2. Если встречается инструкция базового языка, то если условие выполняется, то строка переписывается в выходной файл.

3. Если встречается команда ESLI, то происходит изменение соответствующей переменной среды.

4. Если встречается директива ELSE и такая директива еще не встречалась в этом IF, то если условие было ложным – оно меняется на истину и наоборот. В противном случае генерируется ошибка.

5. Если встречается директива ENDIF, проверяется самый внешний ли это из вложенных IF, если да – происходит выход из структуры, в противном случае восстанавливается выполнимость условия предыдущего IF и условие встречи ELSE, т.е мы снова обращаемся к IF.

6. Процедура обрабатывает строки рекурсивно, возможна обработка вложенных IF.

 

 

Анализ директивы AIF:

1. В процессе обработки макроса, если в поле меток встречаются метки, начинающиеся с %, воспринимаются не как метки внутри макроса, а как ассемблерные метки.

2. Если условие в поле операндов AIF выполняется, то анализируется, возможен ли переход к метке. Переход к метке невозможен, если: к метке уже было произведено обращение в этом макросе; если метка расположена за пределами данного макроса. Если все условия выполняются – происходит переход к метке, игнорируя все встречающиеся команды.

3. Если какое-либо из условий не выполняется, либо если к метке уже происходило обращение, т.е. произойдет зацикливание – генерируется ошибка.

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

 

Анализ директивы AGO:

1. В отличие от AIF AGO является безусловным переходом, т.е. никакие условия перехода не проверяются, а сразу при отсутствии возможности зацикливания и правильности ссылки на метку, начинающуюся с %, происходит переход на эту метку.

2. В случае неправильности формирования строки перехода или возможности зацикливания генерируется ошибка.

 


Date: 2015-08-15; view: 723; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию