ВНИМАНИЕ! Конкурс по программированию!

Проект Programmers.kz и школа hotPen3D2D предлагает Вам курсы по веб-дизайну, веб-программированию и компьютерной графике. Подробности здесь.

 
Информация к новости
 (голосов: 0)

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

Категория: Программирование » Pascal / Turbo Pascal » Уроки Pascal

Параметры

 

Как известно, при компиляции каждого оператора языка компилятор генерирует некоторый машинный (иначе - ассемблерный) код. Это относится и к вызову и возврату из процедур/функций. Для более подробного и наглядного представления о механизмах передачи параметров приведем примерный код, генерируемый компилятором, и иллюстрации к ним.

При передаче параметра по значению генерируемый код следующий (1).

;Для процедуры
proc proc1 near; метаимя,
;реально не создается push bp
mov bp, sp ; получаем
;доступ к стеку
xor ax, ax
call check_stack ; проверка
;переполнения стека
mov word ptr [bp+4], 6 ; :=
pop bp ; восстанавливаем...
ret 2 ; возврат с удалением
;параметров из стека
proc1 endp
. . .
;Для ее вызова
push word ptr [offset D]
; выталкиваем значение
call proc1

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

 

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


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

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

;для процедуры
proc proc1 near
push bp
mov bp, sp
xor ax, ax
call check_stack ; проверка cтека
les di,[bp+4] ; читает из стека указатель
; и записывает в es:di
mov es:word ptr[di], 6 ; :=
pop bp
ret 4 ; возврат с удалением параметров proc1 endp
. . .
mov word ptr[offset D], 9
;вызов процедуры mov di, offset D
push ds
push di
call proc1

 

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


Результат в данном случае таков. Обращение к параметру, переданному по ссылке получается (квази)косвенным: сначала вычисляется адрес адреса параметра - BP+4 (он известен заранее), затем он (адрес параметра) читается, и только затем по нему производится обращение. Как следствие все чтения и/или записи производятся по адресу фактического параметра - в области данных вызывающего процесса. Следует еще раз отметить, что любой параметр, переданный по ссылке занимает в стеке размер полного адреса (в реальном режиме - 4 байта), а доступ к нему несколько дольше.

alt

(1)Наверх Код, представляемый на обозрение, является несколько адаптированной версией того, что показывает Turbo Debugger. Компиляция проводилась без исползования инструкций 286-го процессора. Адаптация заключалась в замене адресов на их символьные обозначения, и, естественно, создании комментариев.

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

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Введите два слова, показанных на изображении: *