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

Вызов процедур методов для объектов: CALL.METHOD


Инструкция CALL расширена таким образом, чтобы поддерживать методы объектов. Вызов метода объекта может генерировать либо не- посредственный вызов (для статических методов), либо косвенный вызов (для виртуальных методов).

Поскольку вы можете использовать косвенный вызов, выполняю- щие вызов инструкции могут нарушить содержимое некоторых регист- ров. В этом случае, если вы используете вызов виртуального мето- да, Турбо Ассемблер позволяет вам выбрать соответствующие регист- ры. Приведем синтаксис расширения CALL.METHOD: CALL указатель_экземпляра METHOD [имя_объекта:]имя_метода [USES [сегм_регистр:]регистр_смещения] [язык_и_аргументы]

где "указатель_экземпляра" должен описывать экземпляр объекта. В режиме MASM часто невозможно определить имя объекта, связанного с экземпляром. В этом случае Турбо Ассемблер позволяет использовать поле "имя_объекта", благодаря чему вы можете задать имя экземпля- ра объекта.

Поле "имя_метода" содержит имя метода, который должен вызы- ваться для конкретного экземпляра объекта.

Примечание: О том, как задавать виртуальных или стати- ческий метод, подробнее рассказывается в Главе 8.

Если метод является виртуальным,и требуется косвенный вызов, инструкция CALL.METHOD выполняет косвенный вызов через регистры ES:BX (ES:EBX для модели USE32 процессора 80386). Если вы хотите использовать другие регистры, можно переопределить их с помощью оператора USES. Поле "сегм_регистр" это необязательный используе- мый сегментный регистр, а "регистр_смещения" - это регистр смеще- ния, используемый для вызова.

Для объектов, описанных с помощью таблиц NEAR, CALL.METHOD загружает только регистр смещения. Турбо Ассемблер предполагает, что сегментный регистр всегда установлен в корректное значение.

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

Поле "язык_и_аргументы" инструкции CALL.METHOD содержит необязательные спецификации языка и аргументов, которые идентичны по форме описанным в предыдущем разделе.

Вызов процедур методов для С++ и Паскаля требует обычно, чтобы экземпляр объекта передавался в качестве аргумента в стеке. Подробнее об этом рассказывается в Главе 18 и Главе 19.



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