Turbo Assembler 3.0. Руководство пользователя

Вложенные процедуры и правила области действия


Хотя вы можете вкладывать одну процедуру в другую, все про- цедуры имеют глобальную область действия, Например:

. . . test1 PROC FAR ; код процедуры CALL test2 ; код процедуры RET test2 PROC NEAR ; код процедуры RET ; ближний возврат test2 ENDP test1 ENDP . . .

В данном примере вне охватывающей процедуры можно вызывать test1 и test2.

Если вы хотите получить локальные подпроцедуры, используйте имя с локальной областью действия, например:

. . . LOCALS test1 PROC FAR ; код процедуры RET @test2 PROC NEAR ; код процедуры RET @test2 ENDP test1 ENDP . . .

Примечание: Директива LOCALS разрешает идентификаторы с локальной областью действия. Подробнее об этом рассказы- вается в Главе 11.

В данном коде в процедуре test1 вы можете обратиться только к процедуре @test2. Фактически, если они не находятся в одной и той же процедуре может существовать несколько процедур с именем @test2. Например, допустимо следующее:

. . . LOCALS test1 PROC FAR MOV si, OFFSET Buffer CALL @test2 RET @test2 PROC NEAR ; некоторый код RET @test2 ENDP

test2 PROC FAR MOV si,OFFSET Buffer2 CALL @test2 RET @test2 PROC NEAR ; некоторый код RET @test2 ENDP test2 ENDP . . .

Следующий код недопустим:

. . . lOCALS test1 PROC FAR MOV si,OFFSET Buffer CALL @test2 RET test1 ENDP

@test2 PROC NEAR ; код процедуры RET @test2 ENDP . . .

так как вызов @test2 задает локальный идентификатор для процедуры test1, а таких идентификаторов не существует.



Содержание раздела