При обращении к подпрограмме могут передаваться: сами данные или адрес участка памяти, где находятся данные. Данные могут находиться:
В большинстве процессоров для а) сохранения-восстановления контекста, б) связи по данным (передачи параметров и возврата значений), в) выделения памяти под локальные переменные используется фрагмент стека, называемый стековым кадром.
Пример на языке С.
int Calc (int x, int y) {
int iX, iY;
iX=2*x+y;
iY=3*y-x;
return iX*iY;
}
Эта процедура принимает два параметра x и y и возвращает результат вычисления несложного арифметического выражения в глобальную ёпеременную z. В процедуре объявлены две локальные переменные. Далее приведен результат компиляции этой процедуры после его дизассемблирования полноэкранным отладчиком TurboDebugger (см. таблицу ниже).
Посмотрим теперь структуру стека (см. таблица ниже). Столбец 2) содержит адреса стека как они получились при компиляции рассматриваемого примера, столбец 3) показывает состояние этих адресов до начала помещения параметров в стек перед вызовом процедуры, столбец 4) — состояние стека после входа в процедуру и выделения места под локальные переменные. В столбце 1) отмечен участок стека, составляющий стековый кадр для рассматриваемого примера.
После входа в процедуру в bp заносится базовый адрес стекового кадра. Благодаря этому, к параметрам можно получить доступ косвенно-регистровой адресацией через bp с положительным смещением [bp+disp], а к локальным переменным — с отрицательным смещением [bp-disp].