Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
468028.rtf
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
701.39 Кб
Скачать

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

Передавать фактические параметры процедуре можно по-разному. Используются несколько способов передачи параметров. Выбор конкретного способа для определенной задачи зависит от количества используемых параметров и сложности их обработки.

1. Передача через регистры: программа перед вызовом заносит входные параметры в некоторые регистры процессора, а после возврата выбирает из регистров значения результатов.

Передача параметров по значению: перед обращением к процедуре основная процедура вычисляет значения фактических параметров и записывает их в регистры.

Пример. 1. Вычислить c=max (a, b)+max (5, a-l), где все числа - знаковые размером в слово. Вычисление max (х, у) описать как процедуру. Условия передачи параметров: первый параметр (х) - через регистр АХ, второй параметр (у) - через регистр ВХ, результат (max) - в регистре АХ.

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

; процедура: АХ= max (АХ, ВХ)

; основная программа

MAX

PROC

FAR

MOV

AX, А

; АХ:=а

CMP

AX, BX

MOV

ВХ, В

; ВХ:=b

JGE

MAX1

CALL

MAX

; АХ:=mах (а, b)

MOV

AX, BX

MOV

С, АХ

; сохранить АХ

МАХ1:

RET

MOV

AX, 5

; АХ:=5

MAX

ENDP

MOV

ВХ, А

DEC

ВХ

; ВХ:=а-1

CALL

MAX

; AX:=max (5, a-l)

ADD

С, АХ

; С:=mах (а, b)+mах (5, а-1)

Передача параметров по ссылке означает передачу адреса (имени) ячейки, соответствующей фактическому параметру, через регистр: основная программа записывает в какой-то регистр адрес фактической переменной, а процедура берет его оттуда. Используют регистры-модификаторы ВХ, ВР, SI или DI, т.к. процедуре придется модифицировать по этому регистру.

Пример 2. Возьмем следующую процедуру на языке Паскаль:

procedure D (var x:integer);:=x div 16;

Пусть в программе есть такие обращения к ней: D(A) и D(B), где А и В-имена переменных, значениями которых являются неотрицательные числа. Используем регистр ВХ: к началу выполнения процедуры в регистре ВХ должен находиться адрес той ячейки (А или В), содержимое которой она изменяет. Доступ к ячейки в этом случае можно получить с помощью конструкции [ВХ].

Фрагмент основной программы, соответствующий обращениям D(A) и D(B):

; процедура

; основная программа

D

PROC

LEA

BX, A

; ВХ=адрес А

PUSH СХ

; сохранить cx

CALL

D

D(A)

MOV CL, 4

LEA

BX, B

; ВХ=адрес В

SHR WORD PTR [BX], CL

X:=x div 16

CALL

D

; D(B)

POP CX

; восстановить СХ

RET

D

ENDP

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

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

. Передача через стек: программа перед вызовом заносит параметры в стек с помощью команды push. Чтобы подпрограмма могла изменять значения параметров, следует передавать ей не сами значения, а адреса параметров. Используется в случае большого количества параметров.

Выполнение процедуры должно начинаться со следующих команд («входные» действия процедуры):

Р PROCUSH ВР; сохранить ВРBP, SP; ВР - на вершину стека

команды процедуры

После записи в стек старого значения ВР (ВРст) для доступа к параметрам процедуры надо использовать выражение вида [ВР+i], где i=2*n (n - размерность параметра).

При выходе из процедуры стек должен быть в том же состоянии, в каком он был после «входных» действий. Для восстановления состояния стека выполняются «выходные» действия:

POP ВР; восстановить старое значение ВР2*k; очистка стека от k параметров-слов и возврат

Р ENDP

По команде RET i*k из стека удаляется адрес возврата, затем стек очищается на указанное операндом число байтов и далее выполняется переход по адресу возврата.

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