Хотя вы можете вкладывать одну процедуру в другую, все про- цедуры имеют глобальную область действия, Например:
. . . 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, а таких идентификаторов не существует.