| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
Что касается всех других аспектов, то вы можете писать про-
цедуры методов на любом известном вам языке или интерфейсе, хотя
обычно используются соглашения по вызову C++ или Паскаля. Аргу-
менты процедур также выбираются по вашему усмотрению. Обычно не-
обходимым является один аргумент - указатель на экземпляр объек-
та. Некоторые процедуры методов могут потребовать дополнительных
параметров. Например, инициализация метода для объекта списка
требует просто указатель на объект списка, в то время как метод
включения в список требует указатель на список, указатель на но-
вый узел для вставки и указатель на узел, включаемый после него.
В использовании статических и виртуальных методов есть свои
достоинства и недостатки. Статические методы определяются на эта-
пе компиляции, а результатом будет непосредственный вызов проце-
дуры метода. Это позволяет выполнить вызов быстрее и не требует
использования промежуточных регистров (как при использовании вир-
туальных методов). Однако, поскольку эти вызовы определяются на
этапе компиляции, вызовы статических методов не обладают гиб-
костью вызовов виртуальных методов.
Турбо Ассемблер 3.0/tasm/#1-2 = 81 =
Вызовы виртуальных методов выполняются непосредственно через
реализацию таблицы виртуальных методов объекта. Тот факт, что вы-
зов является косвенным, приводит к тому недостатку, что при вы-
полнении вызова требуется использование промежуточных регистров
(что может усложнить код программы). Однако большим преимуществом
является то, что вызовы виртуальных методов определяются на этапе
выполнения. Таким образом, вы можете выполнять вызовы виртуальных
методов для порожденного объекта с помощью вызова метода общего
объекта-"предка". При этом не требуется точно знать, с каким ви-
дом объекта-потомка вы имеете дело.
Описание процедур статических и виртуальных методов в точ-
ности совпадает с описанием любой другой процедуры, но имеется
следующее исключение: если для виртуального метода вы опускаете
имя процедуры, то в таблице виртуальных методов создается пустая
неинициализированная ячейка, и Турбо Ассемблер не выводит вам ни-
каких предупреждений. Если метод не является виртуальным, то про-
пуск имени процедуры является ошибкой, поскольку не виртуальные
методы не включаются в таблицу.
Приведем пример процедуры метода:
; Построение объекта связанного списка.
; Это метод-"конструктор".
; Этот метод должен быть статическим.
; При возврате DX:AX указывают на объект связанного списка,
; в противном случае это ноль.
; Объект выделяется, но пока не инициализируется.
list_construct PROC PASCAL FAR
USES ds
; -- Выделение объекта связанного списка --
;; << выполнение выделения >>
ret
ENDP
Таблица виртуальных методов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Таблица виртуальных методов (ТВМ) представляет собой табли-
цу адресов процедур, которые выполняют виртуальные методы. Обычно
данная таблица размещается в сегменте данных программы. Любой
объект, содержащий виртуальные методы, требует, чтобы где-либо в
программе находился экземпляр таблицы виртуальных методов.
Для создания экземпляра таблицы виртуальных методов объекта
используется директива TBLINST. Поскольку эта директива создает
таблицу для последнего описанного объекта, ее следует помещать
непосредственно после описания объекта, например:
INCLUDE list.aso
DATASEG
TBLINST
Турбо Ассемблер 3.0/tasm/#1-2 = 82 =
Инициализация таблицы виртуальных методов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Чтобы вы могли вызывать виртуальные методы, простой реализа-
ции таблицы виртуальных методов недостаточно. Каждый объект с
виртуальными методами включает в свои структуры данных указатель
на таблицу виртуальных методов. Когда вы создаете экземпляр объ-
екта этот указатель нужно инициализировать. Для этой цели можно
использовать директиву TBLINST.
Инициализируйте указатель таблицы виртуальных методов в ме-
тоде init следующим образом:
; Инициализация объекта связанного списка
; Это метод "init"
; Этот метод должен быть статическим.
list_init PROC PASCAL FAR
ARG @@list:dword
USES dx,bx
lds bx,@@list
; -- По адресу ds:bx инициализировать таблицу виртуаль-
; ных методов.
TBLINIT ds:bx
; -- Инициализировать данные объекта
;; << Здесь инициализируются все данные объекта >>
ret
ENDP
Примечание: Заметим, что метод init должен быть стати-
ческим, так как виртуальный метод экземпляра объекта вы вы-
зывать не можете, пока не инициализирован указатель таблицы
виртуальных методов.
Вызов метода объекта
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для вызова метода объекта используйте инструкцию CALL. Для
вызова процедур методов Турбо Ассемблер обеспечивает расширение
стандартной инструкции CALL - CALL...METHOD.
Примечание: Синтаксис инструкции CALL для вызова ста-
тических и виртуальных методов совпадает.
Вызов статического метода
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
При вызове процедуры метода, даже если вы знаете, что вызы-
вается статический метод, следует записывать инструкцию
CALL...METHOD, как если бы вы вызывали виртуальный метод. Это
позволит при вызове статических методов избежать нежелательных
эффектов и предоставляет вам гибкость - возможность изменять ста-
тические методы на виртуальные и обратно без необходимости измене-
Турбо Ассемблер 3.0/tasm/#1-2 = 83 =
ния вызова метода. По этой же причине имеет смысл выбирать проме-
жуточные регистры вызова, даже если вы знаете, что вызываемый
вами метод является статическим.
Вызовы статических методов определяются на этапе компиляции
и преобразуются в непосредственный вызов нужной процедуры метода
объекта. Однако при выполнении вызова не следует вызывать проце-
дуру метода непосредственно. Вместо этого используйте расширенную
инструкцию CALL...METHOD.
В следующей таблице показан пример вызова статического мето-
да init для объекта связанного списка:
CALL foolist METHOD list:init pascal,ds offset foolist
CALL es:di METHOD list:init pascal,es di
Сам адрес вызова является адресом экземпляра объекта. Этот
адрес используется только по синтаксическим причинам. Фактически
генерируемым адресом является непосредственный вызов процедуры
метода.
В данном примере первым вызовом является вызов метода init
объекта list. Так как это статический метод, вы выполняете непос-
редственный вызов процедуры метода list_init. Турбо Ассемблер иг-
норирует экземпляр объекта foolist (он только передается в ка-
честве аргумента процедуре метода).
За именем вызова следует обычный расширенный параметр языка
и список параметров. Язык и параметры зависят от вызываемого вами
метода. Один из параметров обычно является указателем на экземп-
ляр объекта. В данном примере метод воспринимает один параметр,
являющийся указателем на экземпляр объекта.
Вызов виртуального метода
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Любой вызов виртуального метода требует косвенного вызова
процедуры метода. Для этого используйте расширенную инструкцию
CALL...METHOD. Для выполнения вызова Турбо Ассемблер генерирует
следующие инструкции:
1. Загружает промежуточные регистры указателем на ТВМ из эк-
земпляра объекта.
2. Выполняет косвенный вызов соответствующего элемента таб-
лицы.
Таким образом, когда вы задаете:
CALL <экземпляр> METHOD <объект>:<метод> USES :
<вызов_проц>
то генерируются следующие инструкции:
Турбо Ассемблер 3.0/tasm/#1-2 = 84 =
MOV <рег>, [<экземпляр>.<указатель_ТВМ>]
CALL [(<сегм><рег>).<метод>] <вызыв_проц>
Первая инструкция загружает выбранный регистр <рег> адресом
таблицы виртуальных методов из поля указателя ТВМ структуры объ-
екта. Вторая инструкция выполняет косвенный вызов соответствующе-
го метода в таблице.
|
adfun.ru
|
|
|
|