Организация магазина со статической цепочкой
Итак, в случае статической цепочки магазин организован, как это изображено на рис.9.1.
|
Таким образом, на запись текущей процедуры в магазине указывает регистр BP (Base Pointer), с которого начинается динамическая цепочка. На статическую цепочку указывает регистр LP (Link Pointer). В качестве регистров BP и LP в различных системах команд могут использоваться универсальные, адресные или специальные регистры. Локальные переменные отсчитываются от регистра BP вверх, фактические параметры - вниз с учетом памяти, занятой точкой возврата и самим сохраненным регистром
BP.
Вызов подпрограмм различного статического уровня производится несколько по-разному. При вызове подпрограммы того же статического уровня, что и вызывающая подпрограмма (например, рекурсивный вызов той же самой подпрограммы), выполняются следующие команды:
Занесение фактических параметров в магазин JSR A |
Команда JSR A продвигает указатель SP, заносит PC на верхушку магазина и осуществляет переход по адресу A. После выполнения этих команд состояние магазина становится таким, как это изображено на рис. 9.2. Занесение BP, отведение локальных, сохранение регистров делает вызываемая подпрограмма (см. ниже).
|
При вызове локальной подпрограммы необходимо установить указатель статического уровня на текущую подпрограмму, а при выходе - восстановить его на старое значение (охватывающей текущую). Для этого исполняются следующие команды:
Занесение фактических параметров в магазин MOVE BP, LP SUB Delta, LP JSR A |
Здесь Delta - размер локальных вызывающей подпрограммы плюс двойная длина слова. Магазин после этого принимает состояние, изображенное на рис. 9.3. Предполагается, что регистр LP уже сохранен среди сохраняемых регистров, причем самым первым (сразу после локальных переменных).
После выхода из подпрограммы в вызывающей подпрограмме выполняется команда
MOVE (LP), LP |
|
Занесение фактических параметров в магазин MOVE (LP), LP /* столько раз, какова разность уровней вызывающей и вызываемой ПП */ JSR A |
MOVE -Delta(BP), LP |
Тело подпрограммы начинается со следующих команд:
LINK BP , -размер_локальных MOVEM -(SP) |
MOVE BP, -(SP) MOVE SP, BP ADD -размер_локальных, SP |
В результате выполнения этих команд магазин приобретает вид, изображенный на рис. 9.1.
Выход из подпрограммы осуществляется следующей последовательностью команд:
MOVEM (SP)+ UNLK BP RTD размер_фактических |
MOVE BP,SP MOVE (SP),BP ADD #4, SP /* 4 - размер слова */ |
ADD размер_фактических+4, SP JMP -размер_фактических-4(SP) |
В зависимости от наличия локальных переменных, фактических параметров и необходимости сохранения регистров каждая из этих команд может отсутствовать.