 |
ETYPE ? ; неинициализированный экземпляр
ETYPE FOO ; инициализированный экземпляр,
; значение FOO
ETYPE 255 ; число вне ENUM также подходит
Создание экземпляра таблицы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для создания экземпляра таблицы используйте в качестве ди-
рективы выделения данных имя таблицы. Предположим, например, что
вы определили следующую таблицу:
TTYPE TABLE VIRTUAL MoveProc:WORD=MoveRtn, \продолжение...
VIRTUAL MsgProc:DWORD=MsgRtn, \продолжение...
VIRTUAL DoneProc:WORD=DoneRtn,
Тогда оператор:
TTEST TTYPE ?
создает экземпляр таблицы TTYPE (определяя переменную TTEST). В
данном примере, поскольку задано значение неинициализируемых дан-
ных ?, начальные данные в текущем сегменте не генерируются.
Инициализация экземпляров таблицы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Когда вы определяете таблицу, нужно задать начальное значе-
ние для всех ее элементов. Простейший инициализированный экземп-
ляр таблицы содержит просто заданные в определении начальные
данные, например:
TTYPE {}
что эквивалентно следующему:
DW MoveRtn
DD MsgRtn
DW DoneRtn
Фигурные скобки ({}) представляют нулевое инициализирующее
Турбо Ассемблер 3.0/tasm/#1-2 = 210 =
значение. Значение инициализатора определяет, что элементы (если
они есть) имеют начальное значение, которое нужно переопределить,
и каким именно новым значением его требуется переопределить при
выделении данных для экземпляра таблицы.
Инициализатор записи в фигурных скобках имеет следующий син-
таксис:
{[имя_элемента = выражение [,имя_элемента = выражение...]]}
где "имя_элемента" - это имя элемента таблицы, а "выражение" -
это значение, которое вы хотите определить для элемента в данном
экземпляре. Пустое значение указывает, что вы будете использовать
начальное значение элемента из определения таблицы. Значение ?
эквивалентно нулю. Турбо Ассемблер устанавливает для всех элемен-
тов, которые не указываются в инициализаторе, начальное значение,
заданное в определении таблицы. Например:
TTYPE {MoveProc=MoveRtn2,DoneProc=?}
что эквивалентно следующему:
DW MoveRtn2
DD MsgRtn
DW ?
Создание и инициализация экземпляра именованного типа данных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для создания экземпляра именованного типа данных используйте
в качестве директивы выделения данных имя типа. Предположим, нап-
ример, что вы определили следующий тип:
NNTYPE TYPEDEF PTR BYTE
Тогда оператор:
NNTEST NTTYPE ?
создает экземпляр именованного типа NTYPE (определяя переменную
NTTEST). В данном примере, поскольку задано значение неинициали-
зируемых данных ?, начальные данные в текущем сегменте не генери-
руются.
Способ инициализации экземпляра именованного типа зависит от
типа, который этот именованный тип представляет. Например, NTTYPE
в предыдущем примере - это слово, поэтому он будет инициализиро-
ваться, как если бы вы следующим образом использовали директиву
DW:
NTTYPE 1,2,3 ; представляет указатель значений 1,2,3
DW 1,2,3 ; то же, что NTTYPE 1,2,3
Турбо Ассемблер 3.0/tasm/#1-2 = 211 =
Однако, если именованный тип представляет структуру или таб-
лицу, то его нужно инициализировать также, как инициализируются
структуры и таблицы. Например:
foo STRUC
f1 DB ?
ENDS
bar TYPEDEF foo
bar {f1=1} ; должен быть инициализатор структуры
Создание экземпляра объекта
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Создание экземпляра объекта в инициализированном или неини-
циализированном сегменте данных полностью совпадает с созданием
экземпляра структуры. Фактически, объекты в Турбо Ассемблере
представляют собой структуры с некоторыми расширениями. Одним из
таких расширений является элемент структуры @Mptr_<имя_объекта>.
Объектный тип данных с виртуальными методами - это структу-
ра, содержащая один элемент, указывающий на таблицу указателей
виртуальных методов. Именем данного элемента является @Mptr_<имя_
объекта>. Обычно инициализируется с помощью конструктора метода.
Однако, вы можете построить статические объекты, не имеющие конс-
труктора, но инициализируемые с помощью инициализатора в сегменте
данных.
Если вы указываете используемое по умолчанию значение эле-
мента @Mptr_<имя_объекта>, то Турбо Ассемблер будет корректно
инициализировать экземпляр объекта.
Другим отличием структур и объектов является то, что объекты
могут наследовать элементы из предыдущих определений объекта. При
подобном наследовании Турбо Ассемблер интерпретирует его, как
вложенную структуру. В связи с этим для инициализации объектных
данных не рекомендуется использовать угловые скобки (<>).
Создание экземпляра таблицы виртуальных методов объекта
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для каждого объекта, содержащего виртуальные методы, необхо-
димо наличие доступной таблицы виртуальных методов. Правильное
размещение данной таблицы определяет множество факторов, включая
то, какую программную модель вы используете, хотите вы получить
таблицу NEAR или FAR и т.д. Турбо Ассемблер требует от вас только
размещения данной таблицы. Экземпляр последних определенных объ-
ектов вы можете создать, используя псевдооперацию TBLINST, кото-
рая имеет следующий синтаксис:
TBLINST
TBLINST определяет в качестве адреса таблицы виртуальных ме-
тодов объекта @TableAddr_<имя_объекта>. Это эквивалентно следую-
Турбо Ассемблер 3.0/tasm/#1-2 = 212 =
щему:
@TableAddr_<имя_объекта> @TableAddr_<имя_объекта> {}
|