Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_po_PAYa_2-y_semestr.doc
Скачиваний:
4
Добавлен:
27.10.2018
Размер:
453.12 Кб
Скачать

Передача параметров.

procedure Proc(x,y:integer;var z:integer);

begin

z:=x+y;

end;

{основная программа}

proc(a+1, 2, c);

{подготовка фактических параметров}

{подготовка возврата}

{вызов}

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

param

a+1 2 addr(c)

val(a+1)

pointer:=addr(param);

pointer^:=a+1;

pointer:=pointer+cSizeOfInteger;

pointer^:=2;

pointer:=pointer+cSizeOfInteger;

pointer:=addr(c);

Фактически единственным аргументом поля является некоторая стандартная переменная pParam, содержащая адрес списка параметров.

pParam:=addr(param);

Единственная информация, которой обладает подпрограмма – то, что в переменной pParam находится адрес списка параметров с известной структурой. Любая подпрограмма начинается с раскодирования списка параметров.

pointer:=pParam;

x:=pointer^(cSizeOfInt);

pointer:=pointer+cSizeOfInt;

y:=pointer^(cSizeOfInt);

pointer:=pointer+cSizeOfInt;

z:=pointer(cSizeOfInt);

z^:=x;

z^:=z^+y;

goto vozvrat^;

Сохранение и восстановление значений. Соглашение о связях.

Смысл подпрограмм – отделить логику (функцию, операцию как математический объект высокого уровня абстракции) от реализации, определение этой функции на данном языке программирования. Это обязывает к тому, чтобы стандартизировать все детали, не относящиеся к логике. Таким образом, всё, кроме имени функции (адреса начала подпрограммы) и структуры параметров, должно быть общим для всех вызовов. В частности, стандартными должны быть имена vozvrat и pParam. Соответствующее требование носит название стандартного соглашения о связях. Наша схема пока не поддерживает соглашения о связях, а, следовательно, и кратных вызовов.

вызов1 вызов2

vozvrat vozvrat

возврат2 возврат1

восстановление

Второй вызов (точки определения адреса возврата в стандартной переменной vozvrat) портит её значение, поэтому возврат2 невозможен. Кратные же вызовы необходимы не только из соображений удобства программиста. В реальности любой вызов кратный, поскольку наши программы являются подпрограммами главной программы, постоянно работающей на компьютере, а именно ОС.

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

oldvozvrat:=vozvrat

vozvrat:=oldvozvrat

восстанавливает

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]