8.1.1. Конвенция Pascal

Самый очевидный способ выражения вызова процедуры или функции языка высокого уровня, после того как решено, что параметры передаются в стеке и воз­вращаются в регистре АХ/ЕАХ, -.это способ, принятый в языке PASCAL (а так­же в BASIC, FORTRAN, ADA, OBERON, MODULA2), - просто поместить пара­метры в стек в естественном порядке:

запись

some_proc(a,b,c,d,e)

превращается в:

push push push push push

caii

a

b с d e

some_proc

Это значит, что процедура some_proc, во-первых, должна очистить стек по окончании работы (например, завершившись командой ret 10) и, во-вторых, па­раметры, переданные ей, находятся в стеке в .обратном: порядке:

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

proc

 

bp

 

bp, Sp

;  Создать стековый кадр.

equ

[bp+12]   ;  Определения для

equ

[bp+10]

equ

[bp+8]

equ

[bp+6]

equ

[bp+4]

some_proc

push mov

a b с d e

[текст процедуры, использующей параметры a, b, с, d, e]

pop bp ret 10 some_proc endp

Этот код в точности соответствует усложненной форме директивы ргос, кото­рую поддерживают все современные ассемблеры:

some_proc ргос      PASCAL,a:word,b:word,c:word,d:word,e:word

[текст процедуры, с параметрами а, Ь, с, d, e. Так как ВР применяется в ка­честве указателя стекового кадра,   его использовать нельзя!]

ret ;   Эта команда RET будет заменена на RET 10.

S0me_pr0C endp

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