[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / Assembler /

1.Классификация ассемблеров. Многопросмотровые и однопросмотровые ассемблеры. Ссылки вперед.

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

Результатом работы ассемблера является объектный код. Файл, в котором хранится объектный код, называется объектным.

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

В объектном коде содержится следующее:

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

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

1. Записи содержащие объектный код (или тело программы). В них содержится машинное представление команд и данных (сзаданными значениями) в том виде и в той последовательности, в которой они должны находиться в памяти во время выполнения.

2. Записи выделения памяти. В них указывается размер выделяемой памяти, без занесения начальных значений. Эти записи должны находиться в памяти.

3. Служебные записи разных видов. Если в ассемблере данные машины имеются не используемые коды операций, то какой-то из них может использоваться в объектном коде в качестве директивы выделения памяти не используются.

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

1. Проверка программы на отсутствие синтаксических ошибок.

2. Построение объектного кода и запись его в файл.

3. Дополнительные функции - построения листинга программ, таблиц имен и т.д.

В функцию построения объектного кода входит следующее:
- определение адресов всех имен, используемых в качестве меток;

- расшифровка кодов всех команд, составляющих программу; определение значений всех операндов этих команд;

- формирование ашинного предтавления команд, выявление точек входа;

- формирование объектного кода со всей служебной информацией и запись его в файл.

Основные таблицы и пременные ассемблера.

В своей работе ассемблер использует 2 следующие основные таблицы:

- таблица кодов опраций (команд) OpTab.

Эта таблица строится при разработке ассемблера, в нее заносятся все команды языка (мнемоническая форма записи, код и т. д.). В процессе работы ассемблера она не модифицируется.

- таблица имен (символов) NameTab.

Эта таблица строится в процессе трансляции, и внее заносятся все имена, встречающиеся в программе. Тип имени может быть относительным или абсолютным. Абсолютное имя - это константа (A EQU 12). Относительное имя - это адрес (метка, имя области памяти, выражение str+40). str-метка. Значением относительного имени является его адрес. Естественно, что ассемблер не может знать с акого адреса программа дет загружаться в память. Поэтому указывается адрес относительно начала соответствующего сегмента.

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

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

Когда ассемблер встречает метку, ее значение определяется текущим значением счетчика.

Ссылки вперед

Под ссылкой вперед понимается обращение к имени, которое определяется после этого обращения.

Ссылки вперед могут быть на данные, команды или абсолютные имена . Ссылки вперед на абсолютные имена могут быть нескольких уровней. Ссыки вперед на 2 или более уровня в большенствн ассемблеров запрещены. Могут быть запрещены и ссылки вперед на бсолютные имена (одноуровневые ссылки)

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

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

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

Функции и алгоритмы первого и второго просмотра двухпросмотрового ассемблера.

Функции просмотров

1 просмотр. Выявление синтаксических ошибок названий; введение счетчика адреса; определение всех имен

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

Многопросмотровые ассемблеры.

Эти ассемблеры позволяют использовать ссылки вперед на много уровней. Обычно такие ссылки появляются только в результате использования директивы EQU, поэтому эта проблема не является острой.

Тем не менее иногда такие ассемблеры применяются. Обработка происходит следующим образом:

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

2. На II, III и т. д. просмотрах обрабатываются только те фрагменты программы, в которых есть неопределенные имена, т.е. которые были заполнены.

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

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

Видно, что двухпросмотровый ассемблер состоит из 3-х частей:

- таблицы и процуры, используемые при обоих просмотрах;
- процедуры, используемые только при 1 просмотре;
- процедуры, используемые только при 2 просмотре.

В обычных ЭВМ объем памяти вполне достаточен, чтобы в ней размещался сразу весь ассемблер. Это называется обычной организацией.

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

При такой организации сначала в память загружается общая часть и процедуры 1-го просмотра. Затем на место процедур 1-го загружаются процедуры 2-го просмотра.

Благодаря этому ассемблер для своего выполнения требует меньше памяти при сохранении всех функциональных свойств.

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

Перемещение программ и модификация адресов.

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

При выполнении программы она загружается в память с какого-то адреса, называемого адресом загрузки или загрузочным адресом; и значение этого адреса должно быть добавлено ко всем адресам, упоминающимся в программе.

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

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

Модификаторы

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

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

Обобщенно-абстрактный способ представления объектного кода.

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

2. В начале некоторой записи указывается ее тип (1байт-символ), после этого указывается длина записи.

3. Применяют записи следующих типов:

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

Типы однопросмотрового ассемблера.

Существует 2 типа однопросмотровых ассемблеров:

. Создающие выполнимый модуль непосредственно в памяти,

. Создающие ОК на диске.

I тип

Такие ассемблеры могут в частности применятся при отладке программ. Чтобы не тратить время для создания объектного кода и загрузку его в память. Обычно в однопросмотровом ассемблере ссылки вперед на данные запрещены, т.е. данные описываются до команд. Ссылки вперед на команды разрешаются следующим образом:

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

Когда операндом является имя. ассемблер ищет его в таблице имен. Если:

1. оно есть и определено, то берется его значение и никаких дополнительных действий не требуется,
2. его нет - в таблицу со сброшенным признаком определенности 0 и формируется 1-й элемент списка ссылок, которые представляют собой адрес операнда, который ссылается на это имя; в команду в качестве операнда записывается 0.
3. имя есть в NameTab, но не определено, тогда в качестве операнда в команду заносится 0 и формируется следующий элемент списка ссылок.

Когда ассемблер встречает определение имени, он ищет его в таблице имен. Если:

1. имени нет в таблице, он заносит его в таблицу и устанавливает признак определенности 1 и указывает значение имени и тип;
2. имя есть в таблице и определено. то это ошибка - повторное определение имени;
3. имя есть в таблице и еще неопределено, тогда устанавливается признак определенности, заносится в таблицу значение имени и его тип, затем список ссылок обрабатывается, а затем уничтожается.
Если часть имен после трансляции остались неопределенными, то фиксируется ошибка.

Обработка ссылок при появлении определения имени. В ассемблере, размещающем программу в памяти, обработка заключается в следующем:

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

II тип

1. Создает объектный файл на диске, работает почти по такому же алгоритму с небольшим отличием:
2. Когда встречается определение имени, на которое раньше были ссылки, то для всех элементов из списка ссылок генерируются модификаторы или заменители
1 способ:
а. используются расширенние модификаторов
б. поместить это имя в таблицу внешних ссылок и определний. Этот путь не экономичен, но может применятся, чтобы не вводить дополнительный тип записей.
2 способ:
формируется специальный модификатор, в котором указывается, что к некоторой ячейке нужно прибавить некоторое значение. Эти модификаторы объединяются в отдельные записи.

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

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

WWW.COMPROG.RU: Всё о программировании




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Программирование под ОС / Assembler /

Первая программа на linux
23-05-2010   

Ассемблер, который я буду использовать - NASM (Netwide Assembler, nasm.2y.net). Этот выбор объясняется тем, что: Во первых, он мультиплатформенный, т.е. для портирования программы на разные ОС достаточно только изменить код взаимодействия с системой, а всю программу переписывать не нужно... подробнее

Кол. просмотров: общее - 4133 сегодня - 0

Использование пакета NuMega Driver Studio для написания WDM - драйверов устройств
17-05-2010   

Разработка WDM - драйвера с использованием только DDK является сложной и трудоемкой задачей. При этом приходится выполнять много однотипных операций: создание скелета драйвера, написание inf - файла для его установки, создание приложения для тестирования и т.п... подробнее

Кол. просмотров: общее - 3940 сегодня - 0

Система классов DriverWorks
17-05-2010   

Возможно, идея писать драйвера объектно-ориентированными и кажется на первый взгляд нелогичной. Но при более близком знакомстве с DriverStudio и с драйверами в общем, оказывается, что это не так уж страшно и довольно удобно... подробнее

Кол. просмотров: общее - 3825 сегодня - 0

Объект устройства device object
17-05-2010   

Объекты устройств являются экземплярами класса KDevice или KPnpDevice. Эти классы являются краеугольными камнями архитектуры DriverWorks: они представляют собой как бы программный образ тех устройств, которые присутствуют в системе... подробнее

Кол. просмотров: общее - 3940 сегодня - 0

Объекты для управления оборудованием
17-05-2010   

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

Кол. просмотров: общее - 4067 сегодня - 0

Популярные статьи



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects