В некоторых устройствах при выполнении команды «goto» адрес возврата вообще нигде не сохраняется. В таком случае для имитации вызова подпрограммы адрес возврата необходимо сохранить в виде переменной. Это может быть реализовано следующим образом:
ReturnVar = AflerGolo goto ; Сохранить адрес возврата
goto Subroutine ; Вызвать подпрограмму
AfterGoto
—
Subroutine ; Начало подпрограммы
ProgramCounter = ReturnVar ; Возвратиться к команде следующей за goto
Функции — это сложные подпрограммы, при выполнении которых определенные параметры передаются из исходной программы в подпрограмму, а после завершения возвращаются обратно. Например, функция на языке С может быть определена следующим образом:
int Func( int i, char far * Ptr );
В этом примере «Func» — функция, требующая два входных параметра: целое число и указатель, и возвращающая значение целого числа. Один из наиболее эффективных и часто встречающихся способов передачи параметров в функцию — это поместить их в стек перед вызовом функции. В подпрограмме можно загрузить индексный регистр значением указателя стека и таким образом получить доступ к параметрам. Этот метод обработки параметров имеет существенное преимущество по сравнению с другими методами: для передачи параметров используется специально выделенный фрагмент памяти. Переменные, определенные внутри функции (включая входные параметры), часто называются «локальными» или «автоматическими», так как они используются только данной функцией, и память для их размещения выделяется автоматически.