Механизмы передачи параметров в процедуру.

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

  1. в вызывающей программе;

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

  1. в процедуре;

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

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

Механизмы передачи параметров в процедуру.

Существует несколько механизмов передачи параметров в процедуру (т.е. способов, как можно передать параметры). Из изученных ранее нам известны механизмы передачи по значению и по ссылке (еще существуют механизмы передачи по возвращаемому значению, по результату, по оценке).

·         Передача по значению;

В данном случае передаются сами значения параметров:

PROCEDUREAA (A: INTEGER);

Однако при передаче больших объемов данных (строк, массивов, структур) такой способ оказывается неэффективным.

·         Передача по ссылке;

В данном случае передается адрес параметра:

PROCEDURE BB (VAR B: INTEGER);

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

 


   Procedure P1

   (VAR A,B: INTEGER)

   BEGIN

   A:=0;

       WRITELN(A,B);

END;

VARX,Y: INTEGER;

BEGIN

X:=1;

Y:=10;

P1(X,X);

END.


в результате выполнения данного кода на печать будет выведено 0 0, что, возможно, является не тем результатом, который ожидает получить программист.

Способы передачи параметров.

Теперь мы поговорим о том, где могут передаваться параметры в процедуру. Мы уже неоднократно использовали функции DOS, прерывание INT 21h, перед вызовом которого необходимые параметры для функций помещались в регистры. Самый простой и самый эффективный механизм передачи параметров – передача в регистрах. Он используется в тех случаях, когда процедуре нужно передать один или несколько (не много) параметров. В случае передачи нескольких параметров принято использовать регистры в соответствие со следующим приоритетом (см. рисунок).

Если мы передаем процедуре сам параметр, то перед вызовом процедуры нужное значение должно быть помещено в регистр.

Если же мы передаем параметр по ссылке, то в регистр нужно поместить адрес параметра, который может представлять собой либо только смещение (2 байта), либо полный адрес (4 байта). Конечно, для передачи полного адреса можно использовать пару регистров общего назначения, однако удобнее поступить следующим образом. Можно взять один из сегментных регистров (например, ES) и поместить туда сегментную часть адреса нужного параметра. Тогда внутри процедуры можно будет адресовать наш параметр обычной парой сегмент:смещение при помощи косвенной адресации, например, ES:[DI].

 

Ссылка на основную публикацию
Adblock detector