Определение именованного типа
Именованные типы представляют простые или сложные типы. Для определения именованных типов вы можете использовать директиву TYPEDEF. Приведем синтаксис режима Ideal.
TYPEDEF имя_типа сложный_тип
В режиме MASM синтаксис следующий:
имя_типа TYPEDEF сложный_тип
где "сложный_тип" описывает любой тип или указатель нескольких уровней косвенности. Подробнее о сложных типах рассказывается в этом разделе. "Имя_типа" определяет имя заданного типа.
Когда вы в выражении указываете названный тип, он действует так же, как простой тип соответствующего размера. Например:
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 [имя]
где "имя" - это имя объекта. "Имя_порождающего_объекта" - это необязательное имя порождающего объекта. (Турбо Ассемблер явно поддерживает только одиночное наследование.) Структура данных порождающего объекта будет автоматически включаться в структуру данных нового объекта, а таблица методов порождающего объекта - в таблицу методов нового объекта.
Каждое поле "элемент_таблицы" описывает имя метода и процедуры метода, связанного с объектом. Синтаксис этого поля такой же, как в определении таблицы.
Поле "элементы_структуры" описывает дополнительные элементы структуры, которые вы хотите определить в структуре данных объекта. Они форматируются точно также, как в открытом определении структуры.
Необязательное ключевое слово "модификаторы" может представлять собой одно из следующих слов:
Разрешенные модификаторыКлючевое слово | Значение |
---|
GLOBAL | Приводит к тому, что адрес таблицы виртуальных методов (если она имеется) будет объявлен общедоступным. | NEAR | Указатель виртуальной таблицы (если она имеется будет содержать смещение (16 или 32, бита в зависимости от выбора текущей модели по USE16 или USE32). | FAR | Указатель виртуальной таблицы (если она имеется будет содержать величины, задающие сегмент и смещение (32 или 48 бит, в зависимости от выбора текущей модели по USE16 или USE32). |
Если вы не задаете модификатор, размер указателя виртуальной таблицы (если он имеется) зависит от того, адресуются ли данные в текущей модели как NEAR, или как FAR.
Директива TBLPTR
В концепции объектов используется таблица виртуальных методов. Экземпляр этой таблицы существует для любого объекта, содержащего виртуальные методы. Структура данных для для любого объекта, содержащего виртуальные методы, также должна содержать указатель на таблицу виртуальных методов этого объекта. Турбо Ассемблер автоматически обеспечивает в структуре данных объекта указатель таблицы виртуальных методов (если это требуется), и вам не нужно задавать его явно с помощью директивы TBLPTR.
Директиву TBLPTR следует использовать в определении структуры данных объекта. TBLPTR позволяет вам явно разместить указатель таблицы виртуальных методов там, где вы хотите. Она имеет следующий синтаксис:
TBLPTR
Размер указателя, который резервирует TBLPTR, определяется тем, задано в текущей модели USE16 или USE32, и тем, какие модификаторы используются в определении объекта.
Идентификаторы, определяемые расширенной директивой STRUC
Расширенная директива STRUC определяет и использует несколько идентификаторов, которые отражают определяемый объект. Эти идентификаторы показаны в следующей таблице:
Идентификаторы, определяемые расширенной директивой STRUCИдентификатор | Значение |
---|
@Object | Текстовая макрокоманда, содержащая текущий объект. | @Table_<имя_объекта> | Табличный тип данных, содержащий таблицу методов объекта. | @Tableaddr_<имя_объекта> | Метка, описывающая адрес таблицы виртуальных методов объекта. | 1 2 3 4 5 6
8 8 8
| |