Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_MET_2.DOC
Скачиваний:
13
Добавлен:
02.05.2019
Размер:
689.66 Кб
Скачать

Передача параметров по ссылке

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

mov ax, offset value

call procedure

Передача параметров по возвращаемому значению

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

mov global_variable, offset value

call procedure

[. . .]

procedure proc near

mov dx, global_variable

mov ax, word ptr [dx]

(команды, работающие с АХ в цикле десятки тысяч раз)

mov word ptr [dx], ax

procedure endp

Передача параметров по результату

Этот механизм отличается от предыдущего только тем, что при вызове процедуры предыдущее значение параметра никак не определяется, а переданный адрес используется только для записи в него результата.

Передача параметров по имени

Это механизм, который используют макроопределения, директива EQU, а также, например, препроцессор С при обработке команды #define. При реализации этого механизма в компилирующем языке программирова­ния (к которому относится и ассемблер) приходится заменять передачу параметра по имени другими механизмами при помощи, в частности, макроопределений.

Если определено макроопределение

pass_by_name macro parameter1

mov ax, parameter1

endm

то теперь в программе можно передавать параметр так:

pass_by_name value

call procedure

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

Передача параметров отложенным вычислением

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

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

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