Процессор

Обращение к подпрограммам - обмен данными

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

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

В большинстве процессоров для а) сохранения-восстановления контекста, б) связи по данным (передачи параметров и возврата значений), в) выделения памяти под локальные переменные используется фрагмент стека, называемый стековым кадром.

Пример на языке С.

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].

Яндекс.Метрика