Основные функции Ассемблера




 

Синтаксический анализ исходного текста программы.

Распределения памяти (назначения относительных адресов) для команд, констант, переменных и литералов.

Трансляции исходной программы в объектный код.

Формирования информации для загрузчика, линковщика.

Формирования листинга программы.

Основные базы данных для формирования просмотра.

Файл исходного текста

Значение программного счетчика.

Таблица машинных операций. Длина команды. Формат команды.

Таблица псевдоопераций.

Таблица имен (меток).

Таблица литералов.

Таблица внешних имен.

Таблица входов.

Лекция (5_10_07)

Машино зависимые части ассемблера:

Форматы данных и форматы команд

Режимы адресации или способы адресации

Перемещение.

Машино не зависимые характеристики ассемблера. Синтаксис языка довольно прост. При написании команд используются приемы которые облегчают написание программы.

Косвенная адресация – для реализации косвенной адресации используется прием, который называется префикс.

Непосредственного операнда

Для литералов – позволяет отказаться от использования отдельного предложения для определения константы и соответственно его имя. Таблица литералов записывается после тела программы.

Средства определение имен и задание значения.

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

Программные блоки – многие ассемблеры предоставляют гибкие средства обработки исходных программ. Они позволяют располагать сгенерированные машинные командные данные в порядке отличного от исходного. Создавать независимые части управляющие секции. Каждая из этих частей сохраняет свою индивидуальность и обрабатывается загрузчиком отдельно.

Объектная программа

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

Загрузка – обеспечивает размещение в оперативной памяти для исполнения. Это системная программа и традиционная система.

Перемещение – позволяет модифицировать объектную программу так, что она может загружаться с адреса, отличного от первоначального.

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

Формат объектной программы.

Запись заголовок.

- // - 2-7 – имя программы

- // - 8-13 – начала адреса программы

- // - 14-19 – длина программы в байтах

Тело. Признак Т.

- // - 2-7 – Начальный адрес в данной записи.

- // - 8-9 – длина текущей записи

- // - 10-69 – объектный код

Запись - конец

- // - 2-7 – адрес первой исполняемой команды

Если большинство команд ассемблера использую относительную и непосредственную адресацию, то для реализации перемещения программ модификации требует отдельные программы ассемблера. Запись в модификатор может быть использованным как для перемещения так и для связок. Он состоит из:

Признак М

- // - 2-7 – начальный адрес модифицированного программного объекта

- // - 8-9 – длина модифицированного поля в полубайтах

- // - 10 – признак модификации

- // - 11 - 16 – внешнее имя

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

 

Лекция (12_10_07)

 

2 вариант – использование маски. С каждым словом программы объектного кода, связывается в разряд перемещения. Эти разряды образую вместе маску, которая записывается сразу после длины тела программы в каждой записи.

3 способ организации перемещения. Во многих ЭВМ перемещения организуется аппаратным образом. Для этого используется базовая адресация – базовый адрес + смещение.

4 вариант. Любой адрес высчитывается относительно.

Управляющая секция – часть программы, после ассемблирования сохраняет свою индивидуальность, и может перемещаться и загружаться независимо от других. Так как эти части логически связанны и не могут существовать отдельно, должен быть реализован механизм связывания и объединения. Чаще всего управляющей секцией выступает процедура функция. Команды одной управляющей секции должны иметь возможность ссылаться на команды и на области данных, расположенных в других секциях. Ссылки нельзя обрабатывать обычным образом, поскольку УС загружается и перемещается независимо дуг от друга и ассемблер ничего не известно. Для каждой внешней ссылке ассемблер генерирует информацию, которая дает возможность выполнить требуемое связывание программы. Имена определенные в одной управляющей секции могут непосредственно использоваться в другой секции. Для того чтобы загрузчик смог их обработать они должны быть описаны как внешние имена.

Запись определения – Столбец 1 D

- // - 2-7 – идентификатор внешнего имени, определенной данной управляющей секцией.

- // - 8-13 – относительный адрес имени

Запись ссылка – столбец 1 R

- // - 2-7 – идентификатор внешнего имени

Пример иллюстрирующий управляющие секции и связывающие программы.

Copy start 0

Варианты построения загрузчиков –

Абсолютный загрузчик – записывает объектную программу в оперативную память и передает управления на адрес ее исполнения.

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

 

Лекция (19_10_07)

 

Загрузчики, которые используют редактор связи.

Редактор связи используется для языков высокого уровня.

Динамические загрузчики

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

Раскручивающий загрузчик.

Применяется метод рекурсии, когда одна программа выполняет свою функцию и загружает следующую.

Макропроцессор

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

Основные функции макропроцесса.

Основной функцией – замена одних групп предложений или символов на другие. Вопросы трансляции их в коды машины не имеют непосредственного отношения к процессу макро генерации. Поэтому механизм работы макропроцессора практически не связан со структурой машин. Любой процессор макро команд должен решать следующие 4 основные задачи.

Распознавание макро определения. Задача усложняется если в нутрии могут быть использованы другие макро определения.

Запоминания макро определения.

Распознать макро вызовы, представлены в формате мнемонического кода операции. Это предполагает, что имена команд обрабатываются как один из типов кода операций.

Выполнить расширения макро команд, постановку, и подстановку фактических параметров.

После обработки макро определений расширенный файл может быть использован в качестве входного файла для ассемблера.

 

Варианты построения макропроцессоров

 

Однопросмотровый

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

Таблица фактических параметров.

Макро процессоры общего назначения.

Они не зависят от конкретного языка программирования.

Достоинства: могут быть использованы для различных языков. Минимум времени для изучения.

Раскручивающие макропроцессоры.

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

Процесс компиляции.

Языки высокого уровня появились в конце 50 начало 60 годов, такие как Фортран, Алгол. Позже Паскаль, Си. Программа которая транслирует любую программу написанную на языке высокого уровня в эквивалентную программу на другом языке (обычно это машинный код) называют компилятором. Два компилятора, реализующие один и тот же язык, на одной и той же машине, могут отличатся хотя бы потому, что разработчики преследовали различные цели при их создании.

Цель:

1. получения эффективного объектного кода программы.

2. Минимизация времени компилирования программы.

3. Разработка небольших объектных программ.

4. Разработка компилятора минимального размера.

5. Создания компилятора обладающий широкими возможностями обнаружения и исправления ошибки.

6. Обеспечение надежности компилятора.

Существует и другой подход, который называется интерпретация, представителем является Basic. Интерпретация состоит в том, что вместо трансляции в машинный код и последующее выполнение программа сначала по операторно транслируется в промежуточный язык, а затем транслируется и выполняется каждый оператор промежуточного языка.

Передать сообщение об ошибках пользователю, часто бывает легче в терминах исходной программы.

Версия программы на языке не редко оказывается компактней, чем машинный код, выдаваемый компилятор.

Изменение части программы не требует перекомпиляции всей программы.

Недостатки:

Медленность работы.

Общая схема обработки языков высокого уровня

 
 

 


Общая структура компилятора

 

Исходная программа ЯВУ

 
 


Лекция (1_11_07)

 

Лексический анализатор – представляет собой первую фазу компилятора. Его основная задача состоит в чтении новых символов и выдачи последовательности лексем. Замена объектов переменной длины символами фиксированной длины. С теоретической точки зрения лексический анализатор не является обязательной частью компилятора. Все его функции могут выполнятся на этапе синтаксического разбора, поскольку полностью регламентированы синтаксисом входного языка. Однако существует несколько причин по которым состав практически всех компиляторов включает лексический анализ.

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

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

Увеличения переносимости компилятора.

Лексема – минимальная единица языка. Исходная программа на ЯВУ представляет собой цепочку образуя последовательность всех листов программы. Язык паскаль использует алфавит, который использует подмножество наборов символа таблицы кодов.

Специальные символы.

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: