Assembler - язык неограниченных возможностей

         

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


Самый простой способ предоставить вложенной процедуре доступ к локальным переменным, объявленным во внешней процедуре, — просто передать ей вместе с параметрами адрес активационной записи, содержащей эти переменные (см. рис. 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, не в стек, а в сегмент данных, но тем не менее существует способ, открывающий быстрый доступ к локальным переменным с любых уровней.



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