Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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. В случае неправильности формирования строки перехода или возможности зацикливания генерируется ошибка.
|