Самый простой способ предоставить вложенной процедуре доступ к локальным переменным, объявленным во внешней процедуре, — просто передать ей вместе с параметрами адрес активационной записи, содержащей эти переменные (см. рис. 17).
Рис. 17. Стек процедуры со статическими ссылками
При этом, если процедура вызывает вложенную в себя процедуру, она просто передает ей свой ВР, например так:
push bp call nested_proc
To есть статическая и динамическая ссылки в активационной записи процедуры nested_proc в этом случае не различаются. Если процедура вызывает другую процедуру на том же уровне вложенности, она должна передать ей адрес активационной записи из общего предка:
push [bp+4] call peer_proc
Если же процедура вызывает процедуру значительно меньшего уровня вложенности, так же как если процедура хочет получить доступ к переменным, объявленным в процедуре меньшего уровня вложенности, она должна проследовать по цепочке статических ссылок наверх, вплоть до требуемого уровня. То есть, если процедура на уровне вложенности 5 должна вызвать процедуру на уровне вложенности 2, она должна поместить в стек адрес активационной записи внешней по отношению к ним обоим процедуры с уровня вложенности 1:
mov bx,[bp+4] ; адрес записи уровня 4 в ВХ mov bx,ss:[bx+4] ; адрес записи уровня 3 в ВХ mov bx,ss[bx+4] ; адрес записи уровня 2 в ВХ push ss:[bx+4] ; адрес записи уровня 1 в стек call proc_at_level2
Этот метод реализации вложенных процедур имеет как преимущества, так и недостатки. С одной стороны, вся реализация вложенности сводится к тому, что в стек помещается всего одно дополнительное число, а с другой стороны — обращение к переменным, объявленным на низких уровнях вложенности (а большинство программистов определяет все глобальные переменные на уровне вложенности 0), так же как и вызов процедур, объявленных на низких уровнях вложенности, оказывается достаточно медленным. Многие реализации языков программирования, использующих статические ссылки, помещают переменные, определяемые на уровне 0, не в стек, а в сегмент данных, но тем не менее существует способ, открывающий быстрый доступ к локальным переменным с любых уровней.