Сборник по задачам и примерам Assembler




Реализация вложенных процедур - часть 3


Рисунок 3.2. Соответствие содержимого дисплея области инициализации после вызова процедур В и С

Если после этого вызвать процедуру D (в то время как В и С еще не завершены), то картина изменится (Рисунок 3.3).

Рисунок 3.3. Соответствие содержимого дисплея области инициализации после вызова процедуры D

После того как некоторый блок (процедура) завершает свою работу, его область инициализации удаляется из памяти (стека) и одновременно соответствующим образом корректируется дисплей.

Большинство языков высокого уровня хранит локальные данные блоков в стеке. Эти переменные называют еще автоматическими, или динамическими. Память для них резервируется путем уменьшения значения регистра-указателя стека ESP/SP на величину, равную длине области, занимаемой этими динамическими переменными. Доступ к этим переменным осуществляется посредством регистра ЕВР/ВР. Если один блок вложен в другой, то для его динамических (локальных) переменных также выделяется место (кадр) в стеке, но в этот кадр помещается указатель на кадр стека для включающего его блока. Команды ENTER И LEAVE как раз и позволяют поддержать в языке ассемблера принципы работы с переменными блоков, как в блочно-структурированных языках. Дисплей организуется с помощью второго операнда команды ENTER и стека.

Например, в начале работы главной процедуры А и после вызова процедуры В кадр стека будет выглядеть так, как показано на Рисунок 3.4.

Рисунок 3.4. Кадр стека после вызова процедур А и В

Из рисунков видно, что, используя дисплей, мы фактически имеем адреса областей инициализации, доступных по признаку вложенности объемлющих блоков. Обратный процесс завершения работы с блоками и удаления соответствующих областей инициализации поддерживается командой LEAVE.

 




Содержание  Назад  Вперед