Директивы 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 ; ошибка: нет следующего @@
1 2
8 8 8
|