Основы конструирования компиляторов

         

Организация магазина со статической цепочкой


Итак, в случае статической цепочки магазин организован, как это изображено на рис.9.1.


Рис. 9.1:

Таким образом, на запись текущей процедуры в магазине указывает регистр BP (Base Pointer), с которого начинается динамическая цепочка. На статическую цепочку указывает регистр LP (Link Pointer). В качестве регистров BP и LP в различных системах команд могут использоваться универсальные, адресные или специальные регистры. Локальные переменные отсчитываются от регистра BP вверх, фактические параметры - вниз с учетом памяти, занятой точкой возврата и самим сохраненным регистром

BP.

Вызов подпрограмм различного статического уровня производится несколько по-разному. При вызове подпрограммы того же статического уровня, что и вызывающая подпрограмма (например, рекурсивный вызов той же самой подпрограммы), выполняются следующие команды:

   Занесение фактических параметров в магазин  
   JSR A

Команда JSR A продвигает указатель SP, заносит PC на верхушку магазина и осуществляет переход по адресу A. После выполнения этих команд состояние магазина становится таким, как это изображено на рис. 9.2. Занесение BP, отведение локальных, сохранение регистров делает вызываемая подпрограмма (см. ниже).


Рис. 9.2:

При вызове локальной подпрограммы необходимо установить указатель статического уровня на текущую подпрограмму, а при выходе - восстановить его на старое значение (охватывающей текущую). Для этого исполняются следующие команды:

   Занесение фактических параметров в магазин  
   MOVE BP, LP  
   SUB Delta, LP  
   JSR A



Здесь Delta - размер локальных вызывающей подпрограммы плюс двойная длина слова. Магазин после этого принимает состояние, изображенное на рис. 9.3. Предполагается, что регистр LP уже сохранен среди сохраняемых регистров, причем самым первым (сразу после локальных переменных).


После выхода из подпрограммы в вызывающей подпрограмме выполняется команда

   MOVE (LP), LP

которая восстанавливает старое значение статической цепочки. Если выход осуществлялся из подпрограммы 1-го уровня, эту команду выполнять не надо, поскольку для 1-го уровня нет статической цепочки.



Рис. 9.3:
При вызове подпрограммы меньшего, чем вызывающая, уровня выполняются следующие команды:

   Занесение фактических параметров в магазин  
   MOVE (LP), LP /* столько раз, какова разность  
                    уровней вызывающей и вызываемой ПП */  
   JSR A

Тем самым устанавливается статический уровень вызываемой подпрограммы. После выхода из подпрограммы выполняется команда

   MOVE  -Delta(BP), LP

восстанавливающая статический уровень вызывающей подпрограммы.

Тело подпрограммы начинается со следующих команд:

   LINK BP , -размер_локальных  
   MOVEM -(SP)

Команда LINK BP, размер_локальных эквивалентна трем командам:

   MOVE BP, -(SP)  
   MOVE SP, BP  
   ADD -размер_локальных, SP

Команда MOVEM сохраняет в магазине регистры.

В результате выполнения этих команд магазин приобретает вид, изображенный на рис. 9.1.

Выход из подпрограммы осуществляется следующей последовательностью команд:

   MOVEM (SP)+  
   UNLK BP  
   RTD размер_фактических

Команда MOVEM восстанавливает регистры из магазина. Команда UNLK BP эквивалентна такой последовательности команд:

   MOVE BP,SP  
   MOVE (SP),BP  
   ADD #4, SP  /* 4 - размер слова */

Команда RTD размер_фактических, в свою очередь, эквивалентна последовательности

   ADD размер_фактических+4, SP  
   JMP -размер_фактических-4(SP)

После ее выполнения магазин восстанавливается до состояния, которое было до вызова.

В зависимости от наличия локальных переменных, фактических параметров и необходимости сохранения регистров каждая из этих команд может отсутствовать.


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