[Назад] [Далее]

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

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

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

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

    push     a
    push     b
    push     с
    push     d
    push     e
    call     some_proc

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

some_proc   proc
            push       bp
            mov        bp,sp        ; создать стековый кадр
a           equ        [bp+12]      ; определения для простого
                                    ; доступа к параметрам
b           equ        [bp+10]
c           equ        [bp+8]
d           equ        [bp+6]
e           equ        [bp+4]

; текст процедуры, использующей параметры а, Ь, с, d, e

            ret        10
some_proc   endp

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

some_proc   proc       PASCAL,а:word,b:word,с:word,d:word,e:word

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

            ret                     ; эта команда RET будет заменена на RET 10
some_proc   endp

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


п»ї
"target=_blank><\/a>") //-->