 |
где "язык" представляет собой C, CPP, PASCAL, BASIC, FORTRAN,
PROLOG или NOLANGUAGE и определяет соглашения конкретного языка,
применяемые к имени переменной. Использование спецификатора языка
в директиве PUBLIC временно переопределяет временно переопределя-
ет текущую установку языка (по умолчанию NOLANGUAGE, если другой
язык не задан в директиве .MODEL).
Турбо Ассемблер описывает идентификатор в объектном модуле
таким образом, что он будет доступен всем другим модулям. Если вы
не сделаете идентификатор общедоступным, то сможете обращаться к
нему только из текущего модуля, например:
PUBLIC XYPROC ; процедура общедоступна
XYPROC PROC NEAR
Описание идентификаторов библиотеки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Вы можете использовать идентификаторы, как динамические точ-
ки входа для динамически компонуемых библиотек (DLL). Для описа-
ния идентификаторов, которые будут доступны таким образом, ис-
пользуйте директиву PUBLICDDL. Она имеет следующий синтаксис:
PUBLICDLL [язык] идентификатор [,[язык] идентификатор] ...
Турбо Ассемблер описывает идентификатор в объектном файле,
как динамически компонуемую точку входа, благодаря чему они могут
быть доступны в других программах. Спецификатор "язык" приводит к
применению специфических для языка соглашений к конкретному имени
идентификатора. Допустимыми спецификаторами языка являются специ-
фикаторы C, CPP, PASCAL, BASIC, FORTRAN, PROLOG и NOLANGUAGE.
Приведем пример кода с использованием PUBLICDLL:
PUBLICDLL XYPROC ; процедура XYPROC доступна как
XYPOROXC PROC NEAR ; динамически компонуемая точка
; входа
Турбо Ассемблер 3.0/tasm/#2-2 = 60 =
Определение внешних идентификаторов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Внешние идентификаторы - это идентификаторы, которые опреде-
лены вне модуля и которые вы можете использовать внутри модуля.
Эти идентификаторы должны быть описаны с помощью директивы
PUBLIC. Директива EXTRN имеет следующий синтаксис:
EXTRN определение [,определение] ...
где "определение" описывает идентификатор и имеет следующий фор-
мат:
[язык] имя [[счетчик_1]] :сложный_тип [:счетчик_2]
Описание глобальных идентификаторов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Глобальные идентификаторы действуют также, как общедоступ-
ные, при этом вам не нужно определять PUBLIC или EXTRN. Если пе-
ременная определена в модуле, она действует как общедоступная.
Если нет, она действует как внешняя. Для определения глобальных
идентификаторов вы можете использовать директиву GLOBAL. Директи-
ва GLOBAL имеет тот же синтаксис, что директивы PUBLIC и EXTRN
(их синтаксис описан в предыдущих разделах).
Директива GLOBAL позволяет вам иметь включаемый файл, кото-
рый будет включаться во все исходные модули. Включаемый файл со-
держит все совместно используемые данные, определенные как гло-
бальные идентификаторы. Когда вы в каждом модуле ссылаетесь на
эти элементы данных, директива GLOBAL действует как директива
EXTRN, описывая для другого модуля, как определены данные.
Перед тем, как использовать его где-либо в исходном коде, вы
должны описать идентификатор как GLOBAL. Кроме того заметим, что
при задании аргументов директивы GLOBAL используется тот же син-
таксис, что и в директиве EXTRN.
Приведем пример:
GLOBAL X:WORD, Y:BYTE
X DW 0 ; идентификатор стал доступен в
; других модулях
mov al, Y ; описан как внешний
Определение общих переменных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Общие переменные действуют как внешние переменные, но здесь
есть одно существенное различие: общие переменные распределяются
компоновщиком. Общие переменные переменные на самом деле аналоги-
чны глобальным переменным, но вы не можете присвоить им начальные
Турбо Ассемблер 3.0/tasm/#2-2 = 61 =
значения. На эти неинициализированные переменные можно ссылаться
из нескольких модулей.
Для определения общей переменной вы можете использовать ди-
рективу COMM. Она имеет следующий синтаксис:
COMM определение [,определение]...
Каждое "определение" описывает идентификатор и имеет следую-
щий формат:
[расстояние] [язык] имя_идентификатора[[счетчик_1]]:
сложный_тип [счетчик_2]
где поле "расстояние" не является обязательным и может быть FAR
или NEAR. Если вы не зададите "расстояние", по умолчанию оно бу-
дет соответствовать используемой модели памяти. Если вы не ис-
пользуете упрощенные директивы сегментации, то по умолчанию ис-
пользуется NEAR. В крошечной, малой и средней моделях по
умолчанию также используется NEAR, а во всех других - FAR.
Поле "язык" задает язык: C, PASCAL, BASIC, FORTRAN, PROLOG
или NOLANGUAGE. Использование в директиве COMM спецификатора язы-
ка временно переопределяет текущую установку языка (по умолчанию
или заданную с помощью директивы .MODEL). Заметим, что для того,
чтобы действовало данное средство, вам не обязательно использо-
вать директиву .MODEL.
Поле "имя_идентификатора" задает имя идентификатора, который
должен быть общим, и память для которого должна выделяться на
этапе компоновки. В этом поле можно также задавать коэффициент
размера элемента массива "счетчик_1", который должен учитываться
в вычисляемом объеме общей памяти. Если в качестве расстояния за-
дано FAR, то компоновщик, использует значение "счетчика_2", чтобы
указать, сколько имеется элементов с размером, равным произведе-
нию основного размера элемента (который определяется его типом)
на "счетчик_1". По умолчанию значение поля "счетчик_1" равно 1.
"Сложный_тип" - это тип данных аргумента. Он может быть либо
простым типом, либо сложным выражением с указателем. Более под-
робно о синтаксисе сложного типа рассказывается в Главе 5.
Необязательное значение "счетчик_2" определяет, сколько эле-
ментов определяет эта общая переменная. Если вы не задаете это
поле, то подразумевается значение 1. Полный объем памяти, выделя-
емой для общей переменной, равен произведению значения "счет-
чик_2" на длину, заданную полем "тип", и на значение "счетчик_1".
В режиме MASM, предполагается, что общие идентификаторы,
описанные вне любого сегмента, должны быть доступны с помощью ре-
гистра DS, что не всегда может допустимым предположением. Убеди-
тесь, что вы либо поместили в DS корректное значение сегмента,
либо при ссылке на эти переменные используете переопределение
Турбо Ассемблер 3.0/tasm/#2-2 = 62 =
сегмента. В режиме Ideal Турбо Ассемблер корректно проверяет, яв-
ляются ли общие переменные адресуемыми, используя любой из теку-
щих сегментных регистров, описанный в директиве ASSUME.
Приведем пример использования директивы COMM:
COMM buffer:BYTE:512 ; во время компоновки выделяет-
; ся 512 байт
COMM abc[41]:WORD:10 ; на этапе компоновки выделяет-
; ся память 820 байт (10 эле-
; ментов из 41 слова каждый)
COMM FAR abc[41]:WORD:10 ; на этапе компоновки выделяет-
; ся 10 элементов из 82 байт
; (2 байта * 41 элемент)
Включение библиотеки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В том случае, когда вы знаете, что ваш исходный файл будет
всегда использовать подпрограммы заданной библиотеки, можно ис-
пользовать директиву INCLUDELIB. Директива INCLUDELIB сообщает
компоновщику, что нужно включить указанную библиотеку. В режиме
Ideal эта директива имеет следующий синтаксис:
INCLUDELIB "имя_файла" ; обратите внимание на кавычки!
а в режиме MASM:
INCLUDELIB имя_файла
где "имя_файла" - это имя библиотеки, которую вы хотите включать
с помощью компоновщика на этапе компоновки. Если вы не укажете в
заданном имени файла расширение, то компоновщик подразумевает
расширение .LIB.
Приведем пример:
INCLUDELIB "diskio" ; включает DISKIO.LIB
Турбо Ассемблер 3.0/tasm/#2-2 = 63 =
Глава 17. Генерация листинга
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
|