Глава 11. Управление областью действия идентификаторов

          В Турбо Ассемблере и большинстве других языков  программиро-
     вания идентификатор в зависимости от того, где он находится в мо-
     дуле, может   иметь   разное   значение.   Например,    некоторые
     идентификаторы могут  иметь одно и то же значение во всем модуле,
     а другие определены только для конкретной процедуры.

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


Переопределяемые идентификаторы

Некоторые типы идентификаторов, которые поддерживает Турбо Ассемблер, рассматриваются как переопределяемые. Это означает, что вы можете в любом месте модуля переопределить идентификатор данного типа другим идентификатором данного типа. Этим свойством, например, обладают числовые идентификаторы: foo = 1 mov ax,foo ; поместить 1 в AX foo = 2 mov ax,foo ; поместить в AX 2 В общем случае область действия данного переопределяемого идентификатора начинается в точке его определения и продолжается до того места, в котором он переопределяется. Область действия последнего переопределения идентификатора включает в себя область от начало модуля до первого определения идентификатора. Например: mov ax,foo ; поместить 2 в AX! foo = 1 mov ax,foo ; поместить 1 в AX foo = 2 ; это определение расширяется на ; начало модуля. mov ax,foo ; поместить 2 в AX Типы переопределяемых идентификаторов перечислены в следую- щем списке: - текстовая макрокоманда; - числовое выражение; - макрокоманда из нескольких строк; - структура/объединения; - таблица; - запись; - перечисление. Примечание: Об этом подробнее рассказывается в Главе 5.

Область действия в границах блока

Ограничение области действия границами блока позволяет иден- тификатору иметь область действия, соответствующую процедуре или функции. Турбо Ассемблер поддерживает два типа области действия в границах блока: в стиле MASM и в стиле самого Турбо Ассемблера.

Директивы LOCALS и NOLOCALS

Турбо Ассемблер использует двух символьный код, присоединяе- мый к идентификаторам в виде префикса и определяющий, что иденти- фикатор в процедуре имеет локальную область действия. Это префикс локального идентификатора обозначается как @@. Для разрешения идентификаторов, имеющих локальную область действия, можно ис- пользовать директиву LOCALS. Ее синтаксис имеет следующий вид: LOCALS [префикс_идентификатора] Необязательное поле "префикс_идентификатора" содержит иден- тификатор (размером в два символа), который Турбо Ассемблер будет использовать в качестве префикса локального идентификатора. Нап- ример: LOCALS ; по умолчанию подразумевается использование ; в качестве префикса @@ foo proc @@a: jmp @@a ; этот идентификатор @@a относится к ; процедуре FOO foo endp bar proc @@a: jmp @@a ; этот идентификатор @@a относится к про- ; цедуре BAR bar endp Если вы хотите запретить идентификаторы с локальной областью действия, можно использовать директиву NOLOCALS. Она имеет следу- ющий синтаксис: NOLOCALS Заметим, что вы можете использовать идентификаторы с об- ластью действия в границах блока вне процедур. В этом случае об- ласть действия идентификатора определяется метками, заданными с помощью двоеточия, которые на являются идентификаторами с об- ластью действия в границах блока. Например: foo: ; начало области действия @@a: ; относится к области действия, начинающейся ; FOO: @@b = 1 ; относится к области действия, начинающейся ; FOO: BAR: ; начало области действия @@a = 2 ; относится к области действия, начинающейся ; BAR:

Область действия в границах блока в MASM

В MASM версий 5.1 и 5.2 метки NEAR, определенные с помощью директивы двоеточия (:), если они находятся в процедуре, и если вы выбрали в директиве MODEL соглашения языка, имеют область действия в границах блока. Однако эти идентификаторы не являются полными идентификаторами, имеющими область действия в границах блока: нигде в программе их нельзя определить никак иначе, чем как ближнюю метку. Например: varsion m510 model small,c codeseg foo proc a: jmp a ; относится к процедуре FOO foo endp bar proc a: jmp a ; относится к процедуре BAR bar endp a = 1 ; недопустимо!

Локальные метки в стиле MASM

В MASM 5.1 и 5.2 предусмотрены специальные идентификаторы, которые вы можете использовать для управления областью действия ближних меток в небольшом диапазоне строк. Это идентификаторы @@, @F и @B. Когда вы описываете @@, как ближнюю метку, используя двоето- чие (:), то определяете уникальный идентификатор вида @@xxxx (где xxxx - это шестнадцатиричное число). @B ссылается на последний определенный таким образом идентификатор. @F ссылается на следую- щий идентификатор с определением такого вида. Например: version m510 @@: jmp @B ; перейти на предыдущий идентификатор @@ jmp @F ; перейти на следующий идентификатор @@ @@: jmp @B ; перейти на предыдущий идентификатор @@ jmp @F ; ошибка: нет следующего @@
                       Назад | Содержание | Вперед