Передача аргументов через общую область памяти
Этот вариант передачи аргументов предполагает, что вызывающая и вызываемая программы условились использовать некоторую область памяти как общую. Транслятор предоставляет специальное средство для организации такой области памяти. Ранее мы разбирали директивы сегментации и их атрибуты. Один из них — атрибут комбинирования сегментов. Наличие этого атрибута указывает компоновщику TLINK, как нужно комбинировать сегменты, имеющие одно имя. Значение common означает, что все сегменты, имеющие одинаковое имя в объединяемых модулях, будут располагаться компоновщиком, начиная с одного адреса оперативной памяти. Это значит, что они будут просто перекрываться в памяти и, следовательно, совместно использовать выделенную память.
Недостатком этого способа в реальном режиме работы микропроцессора является отсутствие средств защиты данных от разрушения, так как нельзя проконтролировать соблюдение правил доступа к этим данным. В защищенном режиме ситуация выглядит лучше. Этот режим рассмотрим позже.
Рассмотрим листинг 14.4 с примером использования общей области памяти для обмена данными между модулями. На этот раз программа состоит уже из двух независимых модулей, находящихся в разных файлах, и поэтому они представляют собой отдельные единицы трансляции. Функционально эти модули реализуют несложную задачу, которая заключается в том, что вызываемые процедуры формируют строку символов и передают ее через общую область, а вызывающая их процедура main выводит строку на экран.
Листинг 14.4. Передача аргументов через общую область памяти (модуль 1) ;
Вызываемые процедуры находятся в другом модуле (листинг 14.5).
Листинг 14.5. Передача аргументов через общую область памяти (модуль 2)
Обратите внимание, что совсем не обязательно, чтобы данные в сегментах common имели одинаковые имена. Главное, и за этим нужно следить с особой тщательностью, — структура общих сегментов. Она должна быть абсолютно идентична во всех модулях данной программы, использующих обмен данными через общую память.
Так как в данном примере программа состоит уже из двух модулей, то наверняка возникнет вопрос, как собрать ее в один исполняемый модуль. Можно предложить следующую последовательность шагов:
1. Выполнить трансляцию модуля prg14_4.asm и получить объектный модуль prg14_4.obj.
2. Выполнить трансляцию модуля prg14_5.asm и получить объектный модуль prg14_5.obj.
3. Скомпоновать программу утилитой TLINK командной строкой вида
tlink /v prg14_4.obj + prg14_5.obj
В итоге будет создан исполняемый модуль prg14_4.exe. Вы можете исследовать этот модуль, используя отладчик, но имейте в виду следующее. В окне MODULE вы увидите только исходный текст программы prg14_4.asm. Для того чтобы войти по команде call в вызываемую процедуру, необходимо нажимать клавишу F7. Обработка этой команды приведет к открытию второго окна, в котором будет выведен текст вызванной процедуры.