Передача параметров.
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^;