Иллюстрированный самоучитель по SVGA

Классификация подпрограмм

По сравнению с исходным текстом в примере В.1 добавились директивы, описывающие блок процедуры Nxtwin, и две дополнительные точки входа Setwin и Prevwin. Кроме того, введена локальная метка @@, переход на нее выполняет команда jmp SHORT @в. В оригинале ей соответствовала команда jmp SHORT Setwin. В данном случае метка Setwin описана как удаленная, короткий переход на нее не возможен, поэтому введена локальная метка.

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

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

PUBLIC name[[, name]]

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

При обработке директивы Макроассемблер определяет типы имен по их описаниям в тексте программы и помешает список имен с указанием типов в объектный модуль. Эти данные нужны компоновщику (iink.exe), они имеют специальное назначение и не влияют на размер будущей задачи. Если вы посмотрите листинг файла, который может формировать Макроассемблер, то увидите, что таким именам присвоена характеристика Global.

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

EXTERN name:type[[, name:type]]

В программном модуле данная директива обязательно располагается перед описанием первого сегмента. Если список внешних имен большой, то директива повторяется нужное число раз. Тип зависит от назначения имени. Переменные могут иметь типы byte, word, dword и т. д. Метки и имена подпрограмм имеют тип far.

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

Правильность указания самих имен Макроассемблер проверить не может.

Внешние имена и их типы нужны компоновщику (iink.exe), поэтому Макроассемблер помещает их в объектный модуль. Это специальная информация, она не влияет на размер строящейся задачи.

Таким образом, общедоступные имена должны быть описаны в двух модулях – источнике и приемнике. В источнике они перечисляются в директиве PUBLIC, а в приемнике – в директиве EXTERN. С их описаниями работает компоновщик. Если в одном из модулей встречается внешнее имя, то он ищет его в списках глобальных имен других модулей. При отсутствии соответствующего описания будет выдано сообщение об ошибке.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.