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

          Символьное определение типов данных помогает вам писать  мо-
     дульный код.  Отделяя определения типа данных от того кода, в ко-
     тором он используется,  вы можете легко  изменять  или  расширять
     структуры данных без необходимости переписывать код. Это позволя-
     ет также организовать символьный доступ к типу данных и его  ком-
     понентам.

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


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

Перечислимые типы данных представляют набор значений, кото- рые можно сохранять в определенном числе бит. Максимальное запи- санное значение определяет фактически необходимое число бит. Приведем пример синтаксиса режима Ideal определения перечис- лимого типа данных: ENUM имя [переменная_перечисления [, переменная_перечисления.]] В режиме MASM вы можете использовать следующий синтаксис: имя ENUM [переменная_перечисления [, переменная_перечисления.]] Каждая "переменная_перечисления" имеет следующий синтаксис: имя_переменной [=значение] Когда вы присваиваете переменной "имя_переменной" конкретное значение, Турбо Ассемблер, если поле "значение" отсутствует, бу- дет присваивает ей значение, равное значению последней перемен- ной в списке, плюс единица. Значения не могут быть относительными или иметь опережающие ссылки. Переменные, создаваемые перечисли- мым типом (ENUM), представляют собой переопределяемые переменные с глобальной областью действия. Предупреждение: Если вы используете в двух перечисли- мых типах данных одно и то же имя переменной, то первое значение переменной будет потеряно, и в результате возник- нет ошибка. "Имя" - это имя типа данных ENUM. Для получения различной информации о присваивании значений переменным вы можете затем ис- пользовать это имя. О присваивании имен перечислимым типам данных в Турбо Ассемблере рассказывается в Главе 5. Имена перечислимых типов данных можно также использовать для создания переменных и выделения памяти. Подробности см. в Главе 12. Перечислимые типы данных являются переопределяемыми. В моду- ле вы можете несколько раз определить одно и то же имя перечисли- мого типа данных. Кроме того, Турбо Ассемблер для определения перечислимого типа данных с большим числом переменных использует синтаксис, в котором указывается несколько строк. Начало такого определения отмечается символом {, а конец - символом }. В режиме Ideal этот синтаксис имеет следующий вид: ENUM имя [переменная_перечисления [, переменная_перечисления.]] {переменная_перечисления [,переменная_перечисления].] . . . {переменная_перечисления [,переменная_перечисления].] } В режиме MASM используется следующий синтаксис: имя ENUM [переменная_перечисления [, переменная_перечисления.]] {переменная_перечисления [,переменная_перечисления].] . . . {переменная_перечисления [,переменная_перечисления].] } Например, все приведенные ниже перечислимые типы данных эк- вивалентны: foo ENUM f1, f2, f3, f4 ; исходная версия foo ENUM { ; версия из нескольких строк f1, f2, f3, f4 } foo ENUM f1, f2, { f3, f4 } ; более компактная версия Примечание: Турбо Ассемблер не распознает в определе- нии перечислимого типа данных из нескольких строк никаких псевдоопераций.

Определение записей с битовыми полями

Данные типа записи представляют собой набор битовых полей. Каждое битовое поле имеет заданную длину (в битах) и начальное значение. Размер данных типа записи равен сумме длин всех полей. Вы можете использовать данные типа записи для максимально компактного представления данных. Например, можно представить группу из 16 флагов (каждый из которых может быть либо установлен (ON), либо сброшен (OFF)) как 16 отдельных бит, 16 отдельных слов, или как запись, содержащую 16 1-битовых полей (наиболее эф- фективный метод). Приведем синтаксис описания данных типа записи режима Ideal: RECORD имя [поле_записи [,поле_записи.]] В режиме MASM этот синтаксис имеет вид: имя RECORD [поле_записи [,поле_записи.]] Каждое "поле_записи" имеет следующий синтаксис: имя_поля : размер_выражения [=значение] где "имя_поля" - это имя поля записи. Турбо Ассемблер будет выде- лять для него битовое поле размером "размер_выражения". "Значе- ние" и размер выражений не могут быть относительными или иметь опережающие ссылки. Имена поля записи имеют глобальную область действия и переопределяться не могут. "Имя" - это имя типа записи. Далее вы можете использовать его в модуле для получения различной информации о данных типа за- писи. Вы можете также использовать имена для этого имена отдель- ных полей записи. Значения и выражения размера не могут быть от- носительными и иметь опережающие ссылки. Имена полей записи являются по области действия глобальными и переопределяться не могут. Вы можете переопределить тип записи и определить в модуле одно и то же имя, как данные типа записи, несколько раз. Вы можете также использовать имена типов записи для создания переменных и выделения памяти. Подробности можно найти в Главе 12. Турбо Ассемблер обеспечивает для полей записи специальную поддержку, которая представляет флаги и данные перечислимого ти- па. Более эффективный доступ к полям записи обеспечивают расши- ренные и дополнительные инструкции. Эта концепция описывается в Главе 13. Для определений данных типа записи, требующих большого числа полей, в Турбо Ассемблере предусмотрен расширенный синтаксис, аналогичный синтаксису перечислимого типа данных. Например, все следующие определения типа данных эквивалентны: foo RECORD f1:1,f2:2,f3:3,f4:4 ; исходная версия foo RECORD { ; версия, использующая f1:1, ; несколько строк f2:2, f3:3, f4:4 } foo RECORD f1:1,f2:2, { ; более компактная версия f3:3,f4:4 }

Определение структур и объединений

Структуры и объединения позволяют вам совмещать и наклады- вать друг на друга данные различного типа. Структура в Турбо Ас- семблер представляет собой тип данных, который содержит один или более элементов структуры. Структуры отличаются от записей, пос- кольку элементы структуры занимают всегда целое число байт, а за- писи описывают поля с произвольным числом бит. Размер структуры равен общему размеру всех входящих в нее элементов. Объединения аналогичны структурам, но все элементы объедине- ния занимают одну и ту же область памяти. Размер объединения ра- вен размеру наибольшего элемента объединения. Объединения полезно использовать, когда блок памяти должен предоставлять несколько разных возможностей, для каждой из которых требуется разная па- мять. Турбо Ассемблер позволяет вам полностью вкладывать структуры и объединения друг в друга, но это может привести в чрезмерной сложности. Например, вы можете получить элемент структуры, кото- рый на самом деле является объединением. В качестве элемента объ- единения можно также использовать структуры.

Открытие определения структуры или объединения

В режиме Ideal для открытия определения данных типа структу- ры или объединения используется следующий синтаксис: STRUC имя или UNION имя В режиме MASM то же самое можно сделать с помощью следующего синтаксиса: имя STRUC или имя UNION Турбо Ассемблер рассматривает все данные или код между отк- рытым определением структуры и соответствующей директивой ENDS как часть данного типа структуры или объединения. Турбо Ассемблер интерпретирует имена типов данных структуры или объединения как глобальные, но переопределяемые. В модуле вы можете несколько раз определить структурный тип или тип объедине- ния с одни и тем же именем.

Задание элементов структуры и объединения

Турбо Ассемблер включает данные в структуры или объединения построчно. Для выделения памяти для данных и создания элементов при определении структуры и объединения используются те же дирек- тивы, что и для выделения данных и создания меток в открытом сег- менте. Например, директива: member1 DW 1 одинаково допустима в сегменте и в определении структуры. В сег- менте данный оператор означает "зарезервировать слово со значени- ем 1 и именем member1". В определении структуры или объединения это означает "зарезервировать слово с начальным значением 1 и именем элемента member1". Если в сегменте или структуре выделяется экземпляр структуры или объединения, вы можете использовать начальное значение эле- мента структуры. Если вы не распределять элементы структуры таким образом, для указания этого используйте в качестве значения дан- ных символ ? (символ неинициализированных данных). Турбо Ассемблер позволяет использовать в определении струк- туры все методы выделения данных, включая экземпляры других структур, объединений, записей, перечислимых типов данных, таблиц и объектов. Более подробно о выделении данных рассказывается в Главе 12. В режимах MASM и Ideal имена элементов структур интерпрети- руются по-разному. В режиме MASM имена элементов структур являют- ся глобальными и не могут переопределяться. В режиме Ideal имена элементов структур считаются локальными для структуры или объеди- нения.

Определение меток элементов структур с помощью директивы LABEL

Директива LABEL позволяет вам создавать элементы структур без выделения данных. Обычно LABEL задает метку с именем или мар- кер в той точке, где она обнаруживается в сегменте. Директива LABEL внутри определения структуры определяет элементы этой структуры. Приведем синтаксис директивы LABEL: LABEL имя сложный_тип В режиме MASM вы можете использовать следующий синтаксис: имя LABEL сложный_тип где "имя" - это имя элемента структуры. "Тип" - это желаемый тип элемента структуры. Он может представлять собой любое допустимое имя типа. Описание имеющихся спецификаторов типов можно найти в Главе 5.

Выравнивание элементов структуры

В определения структуры для выравнивания элементов структур на соответствующие границы можно использовать директиву ALIGN. Например: ALIGN 4 ; выравнивание на границу двойного слова member dd ? ; member будет выравниваться на DWORD

Закрытие определения структуры или объединения

После того, как вы определите все элементы структуры или объединения, нужно закрыть определение структуры или объединения. Для этого используется директива ENDS. В режиме Ideal директива ENDS имеет следующий синтаксис: ENDS [имя] В режиме MASM вы можете использовать синтаксис: имя ENDS где "имя" (если оно присутствует) соответствует имени открытого определения структуры или объединения. Если имя не указано, то закрывается открытая в данный момент структура или объединение. Вы можете также использовать директиву ENDS для закрытия сегментов. Это не приводит к конфликту, поскольку открытие сег- мента внутри структуры или объединения не допускается.

Вложенные структуры и объединения

Турбо Ассемблер позволяется для управления смещениями, прис- ваевыми элементам структуры, использовать вложенные директивы STRUC, UNION и ENDS внутри открытого определения данных типа структуры или объединения. В структуре каждый элемент данных начинается, когда заканчи- вается предыдущий элемент. В объединении каждый элемент данных начинается с того же смещения, что и предыдущий элемент данных. Если отдельный элемент данных может целиком включать в себя структуру или объединение, это дает существенную гибкость и отк- рывает большие возможности. Описание директив STRUC, UNION и ENDS можно найти в следующей таблице: Директивы STRUC, UNION и ENDS Таблица 8.1 -----------------T----------------------------------------------¬ ¦ Директива ¦ Смысл ¦ +----------------+----------------------------------------------+ ¦ STRUC ¦ При использовании внутри открытой структуры ¦ ¦ ¦ или объединения данная директива начинает ¦ ¦ ¦ блок элементов, который внешняя (охватываю- ¦ ¦ ¦ щая) структура или объединение рассматрива- ¦ ¦ ¦ ет, как один элемент. Смещения элементам в ¦ ¦ ¦ блоке присваиваются в возрастающем порядке. ¦ ¦ ¦ Размер блока представляет собой сумму разме- ¦ ¦ ¦ ров всех элементов в нем. ¦ ¦ ¦ ¦ +----------------+----------------------------------------------+ ¦ UNION ¦ При использовании внутри открытой структуры ¦ ¦ ¦ или объединения данная директива начинает ¦ ¦ ¦ блок элементов, который охватывающая струк- ¦ ¦ ¦ тура или объединение рассматривает как один ¦ ¦ ¦ элемент. Элементам блока присваивается одно ¦ ¦ ¦ и то же смещение. Размер блока равен размеру ¦ ¦ ¦ наибольшего элемента в нем. ¦ ¦ ¦ ¦ +----------------+----------------------------------------------+ ¦ ENDS ¦ Завершает блок элементов, начинающихся пре- ¦ ¦ ¦ дыдущей директивой STRUC или UNION. ¦ ¦ ¦ ¦ L----------------+----------------------------------------------- Например, в следующем определении данных типа структуры/объ- единения содержится в общей сложности 5 элементов. CUNION STRUC CTYPE DB ? UNION ; начало объединения ; если CTYPE = 0, использовать следующее. STRUC CT0PAR1 DW 1 CT0PAR2 DW 1 ENDS ; если CTYPE = 1, использовать следующее. STRUC CT1PAR1 DW 3 CT1PAR2 DW 4 ENDS ENDS ; конец объединения ENDS ; конец структурного типа Список этих элементов приведен в следующей таблице: Элементы блока Таблица 8.1 ------------T---------T------------T----------------------------¬ ¦Элемент ¦ Тип ¦ Смещение ¦ Значение по умолчанию ¦ +-----------+---------+------------+----------------------------+ ¦ CTYPE ¦ Byte ¦ 0 ¦ ? (не инициализирован) ¦ ¦ CT0PAR1 ¦ Word ¦ 1 ¦ 1 ¦ ¦ CT0PAR2 ¦ Byte ¦ 3 ¦ 2 ¦ ¦ CT1PAR1 ¦ Byte ¦ 1 ¦ 3 ¦ ¦ CT1PAR2 ¦ Dword ¦ 2 ¦ 4 ¦ L-----------+---------+------------+----------------------------- Длина данной структуры/объединения равна 6 байтам.

Включение одной именованной структуры в другую

Чтобы способствовать наследованию объектов, Турбо Ассемблер обеспечивает способ, при котором весь тип данных структуры или объединения, включая имена элементов, встраивается в открытое оп- ределение структуры. Он интерпретирует встроенную структуру или объединение, как если бы они были вложены в этой точке внутри от- крытого определения структуры или объединения. Таким образом, встраивание одной структуры или объединения в другую принципиаль- но отличается от включения в структуру или объединение экземпляра другой структуры или объединения: экземпляр включает в себя толь- ко инициализированные или неинициализированные данные, в то время как встраиваемая структура или объединение включает в себя имена данных, структур и имена элементов. Приведем синтаксис режима Ideal: STRUC имя_структуры параметры_заполнения В режиме MASM вы можете использовать следующий синтаксис: имя_структуры STRUC параметры_заполнение Оператор такого вида можно использовать только внутри струк- туры или объединения. Здесь "имя_структуры" - это имя ранее опре- деленной структуры или объединения, которая должны включаться. "Параметры_заполнения" задают изменения, которые вы хотите внести в начальные (используемые по умолчанию) значения включенных эле- ментов структуры. Ключевое слово ? указывает, что все встраивае- мые элементы структуры нужно рассматривать, как неинициализиро- ванные. В противном случае поле "параметры_заполнения" имеет следующий синтаксис: { [имя_элемента [=выражение] [,имя_элемента [=выражение].]] } где "имя_элемента" - это имя любого элемента включаемой структу- ры, начальное значение которого при включении требуется изменить. "Выражение" представляет собой значение, на которое вы хотите его изменить. При наличии "выражения" начальное значение этого эле- мента структуры при его включении останется без изменения. Если вы задаете в поле выражения ключевое слово ?, то начальное значе- ние элемента будет записываться при его включении, как неинициа- лизированное. Поскольку в режиме MASM имена элементов структуры являются глобальными, при копировании структуры они не переопределяются. Таким образом, в режиме MASM включение одной структуры в другую более полезно, когда вы делаете это в начале определяемой струк- туры или объединения. Обычно, когда вы создаете экземпляр структуры, нужно обеспе- чить, что инициализированные данные содержал только один элемент объединения (подробности см. в Главе 12). Поскольку при встраива- нии структуры создание экземпляра не предусматривается, это огра- ничение здесь не применяется. Инициализированные данные могут со- держать несколько элементов включаемого объединения, например: FOO STRUC ABC DW 1 DEF DW 2 UNION A1 DW '123' A2 DW ? ENDS ENDS FOO2 STRUC FOO STRUC {A1=2} ; встроить структуру FOO в структуру ; FOO2 с переопределением ; заметим, что по умолчанию в FOO2 ; инициализируется и A1, и A2 GHI DB 3 ENDS Определение структуры FOO2 в предыдущем примере эквивалентно следующей вложенной структуре/объединению: FOO STRUC STRUC ; начало вложенной структуры. ABC DW 1 DEF DW 2 UNION ; начало вложенного объединения. A1 DW '123' A2 DW ? ENDS ; конец вложенного объединения. ENDS ; конец вложенной структуры. GHI DB 3 ENDS Заметим, что при создании экземпляра FOO2 нужно убедиться, что инициализируется только одно значение в объединении.

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

После того, как вы определите структуру или объединение, ин- формацию о структуре и объединении можно получить различными пу- тями. Для получения информации с помощью выражений Турбо Ассемб- лера вы можете использовать имена типа данных структуры или объ- единения. Более подробно об этом рассказывается в Главе 5.

Определение таблиц

Табличный тип данных представляет набор элементов таблицы. Каждый элемент имеет заданный размер (в байтах) и начальное зна- чение. Элемент таблицы может быть виртуальным или статическим. Виртуальному элементу таблицы присваивается смещение в табличном типе данных. Для него резервируется место в каждом экземпляре таблицы. Статических элемент не имеет смещения. В экземпляре таб- лицы пространство для него не резервируется. В целом размер табличного типа данных равен сумме размеров всех виртуальных элементов. Табличные типы данных представляют таблицы методов, исполь- зуемые в объектно-ориентированном программировании. С объектом связано обычно некоторое число методов, которые являются указате- лями на процедуры, работающие с экземплярами объектов. Процедуры методов могут либо вызываться непосредственно (статические мето- ды), либо косвенно, через таблицу указателей процедур методов (виртуальные методы). Для описания табличного типа данных в режиме Ideal можно использовать следующий синтаксис: TABLE имя [элемент_таблицы [,элемент_таблицы.]] Следующий синтаксис работает только в режиме MASM: имя TABLE [элемент_таблицы [,элемент_таблицы.]] Каждое поле "элемент_таблицы" имеет следующий синтаксис: имя_таблицы или [VIRTUAL] имя_элемента [[выражение_счетчика_1]] [: сложный_тип [:выражение_счетчика_2]] [=выражение] где "имя_таблицы" - это имя существующего табличного типа данных, элементы которого целиком встраиваются в определяемую вами табли- цу. Прибегайте к данному синтаксису, если вы хотите использовать наследование. "Имя_элемента" - это имя элемента таблицы. Необязательное ключевое слово VIRTUAL указывает, что элемент является виртуаль- ным, и ему нужно присвоить смещение. "Сложный_тип" может представлять собой любое допустимое вы- ражение сложного типа. Описание допустимых типов выражений можно найти в Главе 5. Если вы не задается поле "сложный_тип", Турбо Ассемблер под- разумевает, что это WORD (или DWORD, если текущей выбранной мо- делью является 32-разрядная модель). Поле "выражение_счетчик_2" задает, сколько элементов данного типа определяется в таблице. Определение элемента таблицы: foo TABLE VIRTUAL tmp:DWORD:4 определяет элемент таблицы с именем tmp, состоящий из 4 двойных слов. По умолчанию, если вы его не задаете, "выражение_счетчи- ка_2" имеет значение 1. Поле "выражение_счетчика_1" - это коэффи- циент размера элемента массива. Для элемента резервируется па- мять, объем, которой определяется произведением "выражение_счет- чик_2", длины, заданной полем "сложный_тип", и "выражения_счетчи- ка_2". Если вы не задаете "выражение_счетчика_2", то по умолчанию его значение равно 1. Общее число элементов таблицы определяется произведением "выражение_счетчика_1" и "выражением_счетчика_2". В режиме Ideal имена элементов таблицы являются локальными для таблицы, а в режиме MASM имеют глобальную область действия. Поле "имя" задает имя табличного типа данных. Позднее вы мо- жете использовать его в модуле для получения информации о таблич- ном типе данных. Для получения информации можно также использо- вать имена отдельных элементов. Подробнее об этом рассказывается в Главе 5. Табличные типы данных являются переопределяемыми. В модуле вы можете несколько раз определить табличный тип данных с одним и тем же именем. Подробнее об этом рассказывается в Главе 12. Кроме того, Турбо Ассемблер обеспечивает соответствующий синтаксис для определений табличного типа данных, в которых ис- пользуется несколько строк. Этот синтаксис аналогичен синтаксису перечислимого типа дан- ных. Приведем пример: foo TABLE t1:WORD,t2:WORD,t3:WORD,t4:WORD ; исходная версия foo TABLE { ; версия, использующая t1:WORD, ; несколько строк t2:WORD, t3:WORD, t4:WORD } foo TABLE t1:WORD,t2:WORD, { ; более компактная версия t3:WORD,t4:WORD }

Переопределение элементов таблицы

Если в одном и том же табличном типе вы описываете два или более элементов с одинаковым именем, то Турбо Ассемблер будет проверять их и анализировать, согласуются ли их размеры и типы. Если это не так, то будет генерироваться ошибка. Турбо Ассемблер будет использовать для элемента последнее начальное значение в таблице. Таким образом, вы можете переопределить начальное значе- ние таблицы поле того, как встроите ее в другую таблицу. Напри- мер: FOO TABLE VIRTUAL MEM1:WORD=MEM1PROC, VIRTUAL MEM2:WORD=MEM2PROC FOO2 TABLE FOO, VIRTUAL MEM1:WORD=MEM3PROC ; переопределить ; наследуемый MEM1

Определение именованного типа

Именованные типы представляют простые или сложные типы. Для определения именованных типов вы можете использовать директиву TYPEDEF. Приведем синтаксис режима Ideal. TYPEDEF имя_типа сложный_тип В режиме MASM синтаксис следующий: имя_типа TYPEDEF сложный_тип где "сложный_тип" описывает любой тип или указатель нескольких уровней косвенности. Подробнее о сложных типах рассказывается в Главе 5. "Имя_типа" определяет имя заданного типа. Когда вы в выражении указываете названный тип, он действует так же, как простой тип соответствующего размера. Например: MOV ax, word ptr [bx] ; простой оператор foo TYPESEF near ptr byte ; FOO - это слово MOV ax, foo ptr [bx] ; поэтому это тоже работает

Определение объекта

Объект содержит структуру данных и список соответствующих объекту методов. Турбо Ассемблер используется для представления связанной с объектом структуры структурный тип данных, а для представления связанного с объектом списка методов - табличный тип данных. Определить объекты вам поможет директива STRUC. В режиме Ideal используется следующий синтаксис: STRUC имя [модификаторы] [имя_порождающего_объекта] [METHOD [элемент_таблицы [,элемент_таблицы.]]] элементы_структуры ENDS [имя] В режиме MASM используется следующий синтаксис: имя STRUC [модификаторы] [имя_порождающего_объекта] [METHOD [элемент_таблицы [,элемент_таблицы.]]] элементы_структуры ENDS [имя] где "имя" - это имя объекта. "Имя_порождающего_объекта" - это не- обязательное имя порождающего объекта. (Турбо Ассемблер явно под- держивает только одиночное наследование.) Структура данных порож- дающего объекта будет автоматически включаться в структуру данных нового объекта, а таблица методов порождающего объекта - в табли- цу методов нового объекта. Каждое поле "элемент_таблицы" описывает имя метода и проце- дуры метода, связанного с объектом. Синтаксис этого поля такой же, как в определении таблицы. Поле "элементы_структуры" описывает дополнительные элементы структуры, которые вы хотите определить в структуре данных объек- та. Они форматируются точно также, как в открытом определении структуры. Необязательное ключевое слово "модификаторы" может представ- лять собой одно из следующих слов: Разрешенные модификаторы Таблица 8.3 ---------------------T------------------------------------------¬ ¦ Ключевое слово ¦ Значение ¦ +--------------------+------------------------------------------+ ¦ GLOBAL ¦ Приводит к тому, что адрес таблицы вир- ¦ ¦ ¦ туальных методов (если она имеется) бу- ¦ ¦ ¦ дет объявлен общедоступным. ¦ ¦ ¦ ¦ ¦ NEAR ¦ Указатель виртуальной таблицы (если она ¦ ¦ ¦ имеется будет содержать смещение (16 или ¦ ¦ ¦ 32, бита в зависимости от выбора текущей ¦ ¦ ¦ модели по USE16 или USE32). ¦ ¦ ¦ ¦ ¦ FAR ¦ Указатель виртуальной таблицы (если она ¦ ¦ ¦ имеется будет содержать величины, задаю- ¦ ¦ ¦ щие сегмент и смещение (32 или 48 бит, в ¦ ¦ ¦ зависимости от выбора текущей модели по ¦ ¦ ¦ USE16 или USE32). ¦ L--------------------+------------------------------------------- Если вы не задаете модификатор, размер указателя виртуальной таблицы (если он имеется) зависит от того, адресуются ли данные в текущей модели как NEAR, или как FAR.

Директива TBLPTR

В концепции объектов используется таблица виртуальных мето- дов. Экземпляр этой таблицы существует для любого объекта, содер- жащего виртуальные методы. Структура данных для для любого объек- та, содержащего виртуальные методы, также должна содержать указа- тель на таблицу виртуальных методов этого объекта. Турбо Ассемблер автоматически обеспечивает в структуре данных объекта указатель таблицы виртуальных методов (если это требуется), и вам не нужно задавать его явно с помощью директивы TBLPTR. Директиву TBLPTR следует использовать в определении структу- ры данных объекта. TBLPTR позволяет вам явно разместить указатель таблицы виртуальных методов там, где вы хотите. Она имеет следую- щий синтаксис: TBLPTR Размер указателя, который резервирует TBLPTR, определяется тем, задано в текущей модели USE16 или USE32, и тем, какие моди- фикаторы используются в определении объекта.

Идентификаторы, определяемые расширенной директивой STRUC

Расширенная директива STRUC определяет и использует несколь- ко идентификаторов, которые отражают определяемый объект. Эти идентификаторы показаны в следующей таблице: Идентификаторы, определяемые расширенной директивой STRUC Таблица 8.4 ---------------------------T------------------------------------¬ ¦ Идентификатор ¦ Значение ¦ +--------------------------+------------------------------------+ ¦ @Object ¦ Текстовая макрокоманда, содержащая¦ ¦ ¦ текущий объект. ¦ ¦ ¦ ¦ ¦ @Table_<имя_объекта> ¦ Табличный тип данных, содержащий¦ ¦ ¦ таблицу методов объекта. ¦ ¦ ¦ ¦ ¦ @Tableaddr_<имя_объекта>¦ Метка, описывающая адрес таблицы¦ ¦ ¦ виртуальных методов объекта. ¦ L--------------------------+-------------------------------------
                       Назад | Содержание | Вперед