Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kratkie_otvety_ekzamen_CP_2011-12.docx
Скачиваний:
20
Добавлен:
14.04.2019
Размер:
132.13 Кб
Скачать

30.Вызов подпрограмм

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

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

В любом случае вызов подпрограммы осуществляется командой call. Подпрограмма должна завершаться командой ret, служащей для возврата управления в ту точку, откуда подпрограмма была вызвана.

Команда вызова подпрограммы call может использоваться в 4 разновидностях. Вызов может быть:

прямым ближним (в пределах текущего сегмента команд);

прямым дальним (в другой сегмент команд);

косвенным ближним (в пределах текущего сегмента команд через ячейку с адресом перехода);

косвенным дальним (в другой сегмент команд через ячейку с адресом

перехода).

Подпрограммы на asm вызывается командой call при этом выполн. сл. действия: -1-в стеке сохр. адрес сл. после call команды (для мал. моделей только регистр IP, большие – CS:IP).-2-В регистр CS:IP для больших моделей или IP загр. адрес точки входа в подпр.-3- посл. командой подпрогр. должна быть команда ret она загр. из стека адрес сл. после call команды. my_proc PROC – имя процедуры---my_proc ENDP. Для передачи параметров исп. 2 способа: - через регистр; - через стек; Также можно передавать копию аргумента или адрес аргумента. Команда CALL имеет 4 модификации: - вызов прямой ближний(в пределах текущего программного сегмента – near ptr):call near ptr proc1;- вызов косвенный ближний(word ptr): mov bx,offset proc1---call [bx];- прямой дальний вызов(вызов процедуры, расположенной в другом сегменте кода – far ptr): call far ptr proc1; - вызов косвенный дальний(dword ptr): adr dd proc1---call DS:adr (или call dword ptr adr).

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

Существует несколько способов передачи параметров в подпрограмму.

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

int func1(int x) { x=x+1; return x; }

Передача параметров по ссылке. В формальный параметр может быть помещён сам фактический параметр (обычно это реализуется путём помещения в формальный параметр ссылки на фактический). При этом любое изменение формального параметра в подпрограмме отразится на фактическом параметре — оба параметра во время вызова подпрограммы суть одно и то же. Параметры, передаваемые по ссылке, дают возможность не только передавать параметры внутрь подпрограммы, но и возвращать вычисленные значения в точку вызова. Для этого параметру внутри подпрограммы просто присваивается нужное значение, и после возврата из подпрограммы переменная, использованная в качестве фактического параметра, получает это значение.

void func2(int &x) { x=x+1; }

Передача параметров по имени. В формальный параметр может быть помещено произвольное выражение. При этом вычисление этого выражения произойдёт внутри подпрограммы в тот момент, когда потребуется его значение. Если это значение фигурирует несколько раз, то и вычисляться оно будет тоже несколько раз. Параметры, передаваемые по имени, дают возможность писать довольно универсальные подпрограммы. Такой способ передачи параметров используется, к примеру в языках Алгол или Алгол 68.

Передача параметров через стек. Это фактически разновидность передачи параметра по значению «с ручным приводом», в данном случае отсутствует понятие формальных и фактических параметров. Все параметры лежат на стеке, причём их типы, количество и порядок не контролируются компилятором. Данный подход реализован в языке Форт.

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