Меню сайта

Урок 93. Редактор связей (Многомодульность)

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

— — — — — Программа редактирования связей LINK(LINK.EXE), записанная на
— — — той же дискете, что и другиераспространенные в DOS программы,
— — — фактически реализует две различныефункции. Во-первых, она может
— — — связать много различных объектных модулейв одну программу.
— — — Во-вторых, на основе ассемблерногообъектного модуля редактор связи
— — — формирует выполняемый загружаемый модуль.Рассмотрим по отдельности
— — — обе эти функции программы LINK.

Многомодульность

— — — Как указывает само имя программы LINK, ееосновное назначение
— — — «связать», или объединить,несколько объектных модулей в один
— — — выполняемый модуль. — Все рассмотренные до сих пор примеры
— — — относились к одномодульным программам,т.е. — все, что они должны
— — — были выполнять, реализовывалось в одномисходном модуле. — Однако
— — — этот путь не всегда возможен илижелателен.

— — — — — Имеется ряд причин, в силу которыхпрограмма программа сожет
— — — быть разбита на несколько модулей.Во-первых, размер программы.
— — — Редактирование очень большой программыстановится весьма громоздким
— — — и трудным делом, а ее ассемблированиезанимает много времени.
— — — Предположим, что вы допустили ошибку вединственной строке
— — — ассемблерной программы, состоящей из 5000строк. Чтобы изменить
— — — одну эту строку, необходимо выполнитьредактирование всей
— — — программы. После этого нужнооттранслировать всю программу из 5000
— — — строк, что занимает довольно многовремени. После относительно
— — — быстрого этапа редактирования связейпрограмма готова к выполнению.

— — — — — Предположим, теперь, что вместо того,чтобы иметь дело с
— — — программой, состоящей из 5000 строк, выразбиваете ее на десять
— — — программых модулей, по 500 строк в каждом.Для внесения изменений в
— — — единственную строку вам необходимовыполнить редактирование только
— — — исходного файла из 500 строк.Ассемблирование программы из 500
— — — строк занимает значительно меньше времени,чем программы из 5000
— — — строк. Этап редактирования связей все также будет занимать
— — — относительно немного времени, особенно посравнению с
— — — ассемблированием большой программы.Уменьшение размеров отдельных
— — — модулей позволяет более быстро осуществитьпроцесс
— — — редактирования-ассемблирования.

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

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

— — — — — Разбиение программы на модули требует отпрограммиста ряда
— — — действий. Во-первых, нужно тщательнопродумать, как ваша программа
— — — будет строиться из меньших компонентов.Во-вторых, нужно определить
— — — как входные, так и выходные параметры этихменьших программ. И
— — — наконец, должна быть возможность обменаданными между программными
— — — м
одулями. Первые два пункта относятся косновам программирования и
— — — мы их здесь касаться не будем. Последнийже пункт связан с
— — — ассемблированием и редактором связей,поэтому его мы рассмотрим.

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

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

Категория: Программирование на Ассемблере | Дата: 28.01.13

Меню раздела
Блок