Turbo Assembler 3.0. Руководство пользователя

         

Вызов процедур с кадрами стека


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

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

Используемые процедурой интерфейсные соглашения определяют порядок, в котором аргументы должны заноситься в стек. Для проце- дур Бейсика, Фортрана и Паскаля аргументы заносятся в стек в том порядке, в котором они указываются. Для языков Си и С++ аргументы заносятся в стек в обратном порядке.

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

Турбо Ассемблер с помощью расширенной инструкции CALL сам выполняет за вас функции по занесению аргументов в стек в нужном порядке и очисткой стека. Вызов процедуры с параметрами имеет следующий синтаксис:

CALL выражение [язык] [,список_аргументов]

где "выражение" является целью инструкции CALL, "язык" задает ис- пользуемые при вызове языковые соглашения. Если вы не задаете язык, Турбо Ассемблер использует по умолчанию язык, заданный в директиве MODEL.

Примечание: О директиве MODEL более подробнее расска- зывается в Главе 7.

Аргументы, если они имеются, указываются после идентификато- ра языка. Синтаксис каждого аргумента в списке совпадает с син- таксисом, который используется в расширенных инструкциях PUSH и POP. Вы можете разделить эти аргументы запятыми, например:

CALL test PASCAL,ax,es OFFSET buffer,blen

Поскольку в данном примере указан Паскаль, Турбо Ассемблер будет заносить аргументы в стек в том порядке, в котором они ука- заны. Этот пример эквивалентен следующим инструкциям:


PUSH ax PUSH es OFFSET buffer PUSH word PTR blen CALL test

Вызов процедуры Си требует, чтобы аргументы заносились в стек в обратном порядке. Турбо Ассемблер делает это автоматичес- ки, поэтому вызов вида:

CALL test C,ax,es OFFSET buffer, word PTR blen

даст в результате следующий код:

PUSH word PTR blen PUSH es OFFSET buffer PUSH ax CALL test SUB sp,8

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

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

Если при вызове используются интерфейсные соглашения NOLANGUAGE, Турбо Ассемблер при наличии любого аргумента сообщает об ошибке. Хотя аргументы для процедуры NOLANGUAGE можно задать с помощью директивы ARG, при вызове такой процедуры требуется явное занесение аргументов в стек.


Содержание раздела