Глава 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 ; ошибка: нет следующего @@
Назад | Содержание | Вперед