[Назад] [Далее]

5.3.1. Вложенные процедуры со статическими ссылками

Самый простой способ предоставить вложенной процедуре доступ к локальным переменным, объявленным во внешней процедуре, — просто передать ей вместе с параметрами адрес активационной записи, содержащей эти переменные (см. рис. 17).


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


п»ї
"target=_blank><\/a>") //-->