Рекурсия.

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

Рассмотрим пример, изображенный на слайде. Процедура LocSt имеет 3 параметра i, j, k и 3 локальные переменные L, M, N. Для упрощения доступа к ним используется директива EQU.

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

 

Таким образом, 6 байтов в стеке останутся нетронутыми при дальнейшей работе процедуры. Обращаться к параметрам процедуры мы также будем обращаться при помощи фиксированных смещений (положительных и отрицательных) или используя символические имена.

По завершении работы процедуры необходимо выполнить следующие действия. Сначала нужно удалить локальные переменные из стека. Для этого выполняется команда ADDSP,6.  Затем восстанавливаются значения используемых регистров (AXи BP). И в завершение при помощи команды RETочищаются 6 байтов из стека, занятые параметрами i, j, k.

Рекурсия.

Рекурсия – это обращение программы к самой себе. Для того чтобы написать рекурсивную программу, необходимо сначала вывести рекуррентное соотношение. Например, на слайде выведено рекуррентное соотношение для вычисления факториала. Кроме того, нужно не забыть задать начальное значение, в данном случае

IF (K=0) THENRec := 0.

Рекуррентное соотношение может быть запрограммировано двумя способами:

  1. Способ итераций;

Вычисление нужного значения производится при помощи цикла, например:

REC PROC

...; итерационные вычисления

JMPREC

RET

Ссылка на основную публикацию
Adblock detector