Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Турбо Ассемблер / Использование Турбо Ассемблера /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Расширенные инструкции - Программирование от RIN.RU
Расширенные инструкции



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


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


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


CALL указатель_экземпляра METHOD [имя_объекта:]имя_метода
[USES [сегм_регистр:]регистр_смещения] [язык_и_аргументы]


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


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


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


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


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


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


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


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


Остаточная рекурсия для методов объектов: инструкция JMP.METHOD


Турбо Ассемблер обеспечивает инструкцию JMP.METHOD, соответствующую инструкции CALL.METHOD. Она имеет следующий синтаксис:


JMP указатель_экземпляра METHOD [имя_объекта:]имя_метода
[USES [сегм_регистр:]регистр_смещения]


Инструкция JMP.METHOD полностью аналогична инструкции CALL.METHOD, за исключением того, что она:


  • генерирует вместо инструкции CALL инструкцию JMP;

  • генерирует код завершения процедуры для очистки стека перед генерацией инструкции JMP.




Инструкция JMP.METHOD позволяет писать эффективный код остаточной рекурсии (tail recursion). Она предназначена для замены общей ситуации, когда инструкция CALL.METHOD дается для конкретного метода с последующей инструкцией RET.


Дополнительные инструкции для объектного программирования


При создании экземпляра объекта требуется инициализировать указатель таблицы виртуальных методом объекта (если он имеется), чтобы он указывал на корректную таблицу виртуальных методов. Инструкция TBLINIT позволяет вам сделать это автоматически. Эта инструкция имеет следующий синтаксис:


TBLINIT указатель_экземпляра_объекта


Поле "указатель_экземпляра__объекта" представляет собой адрес объекта, указатель таблицы виртуальных методов которого нужно инициализировать. Инструкция TBLINIT предполагает, что экземпляр объекта должен иметь тип текущего объекта (другими словами, непосредственно предшествующее определение объекта определяет объектный тип, который инициализирует TBLINIT). Например:


TBLINIT DS:ST


инициализирует указатель таблицы виртуальных методов объекта DS:


SI (если она имеется).

<<<  Назад
 1  2  3  4  5  6 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Начало работы на Турбо Ассемблере

Использование директив и параметров

Общие принципы программирования

Объектно-ориентированное программирование

Использование выражений и значений идентификаторов

Директивы выбора процессора

Использование моделей памяти программы и сегментации

Определение типов данных

Задание и использование счетчика адреса

Описание процедур

Управление областью действия идентификаторов

Определение данных

Использование макрокоманд

Использование условных директив

Интерфейс с компоновщиком

Генерация листинга

Интерфейс Турбо Ассемблера и Borland C++

Интерфейс Турбо Ассемблера с Турбо Паскалем

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь