Assembler для начинающих



              

Многомодульность - часть 2


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



Содержание  Назад  Вперед