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

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^;