русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Одно- и многопроходный Ассемблер


Дата добавления: 2015-06-12; просмотров: 1035; Нарушение авторских прав


Мы показали, что в двухпроходном Ассемблере на 1-м проходе осуществляется определение имен, а на втором — генерация кода.

Можно ли построить однопроходный Ассемблер? Трудность состоит в том, что в программе имя может появиться в поле операнда команды прежде, чем это имя появится в поле метки/имени, и Ассемблер не может преобразовать это имя в адресное выражение, та как еще на знает его значение. Как решить эту проблему?

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

Если объектный модуль сохраняется в объектной памяти, то Ассемблер может отложить формирование кода для операнда — неопределенного имени и вернуться к нему, когда имя будет определено. При появлении в поле операнда команды неопределенного имени поле операнда не формируется (заполняется нулями). Таблица символов расширяется полями: признаком определенного/неопределенного имени, и указателем на список адресов в объектном модуле, по которым требуется модификация поля операнда.

При появлении имени в поле операнда Ассемблер ищет имя в таблице символов. Если имя найдено и помечено как определенное, Ассемблер транслирует его в адресное выражение, как и при 2-проходном режиме. Если имя не найдено, Ассемблер заносит имя в таблицу символов, помечает его неопределенным и создает первый элемент связанного с именем списка, в который заносит адрес в объектном модуле операнда данной команды. Если имя найдено, но помечено как определенное, Ассемблер добавляет в список, связанный с данным именем, адрес в объектном модуле операнда данной команды.

При появлении имени в поле метки команды или директивы Ассемблер определяет значение имени и ищет его в таблице символов. Если имя не найдено, Ассемблер добавляет имя в таблицу и помечает его как определенное. Если имя найдено и помечено как определенное, Ассемблер выдает сообщение об ошибке (неуникальное имя). Если имя найдено, но помечено как определенное, Ассемблер обрабатывает связанный с данным именем список: для каждого элемента списка по хранящемуся в нем адресу в объектном модуле записывается значение имени. После обработки список уничтожается, значение имени сохраняется в таблице символов и имя помечается как определенное.



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

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

Для чего может понадобиться многопроходный Ассемблер? Единственная необходимость во многих проходах может возникнуть, если в директиве EQU разрешены ссылки вперед. Мы упоминали выше, что имя в директиве EQU может определяться через другое имя. В одно- или двухпроходном Ассемблере это другое имя должно быть обязательно определено в программе выше. В многопроходном Ассемблере оно может быть определено и ниже. На первом проходе происходит определение имен и составление таблицы символов, но некоторые имена остаются неопределенными. На втором проходе определяются имена, не определившиеся во время предыдущего прохода. Второй проход повторяется до тех пор, пока не будут определены все имена (или не выяснится, что какие-то имена определить невозможно). На последнем проходе генерируется объектный код.

 

Лекция 11.
Логика и организация программы



<== предыдущая лекция | следующая лекция ==>
Двухпроходный Ассемблер — второй проход | Команда LOOP


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.005 сек.