Определение таблиц
Табличный тип данных представляет набор элементов таблицы. Каждый элемент имеет заданный размер (в байтах) и начальное значение. Элемент таблицы может быть виртуальным или статическим. Виртуальному элементу таблицы присваивается смещение в табличном типе данных. Для него резервируется место в каждом экземпляре таблицы. Статических элемент не имеет смещения. В экземпляре таблицы пространство для него не резервируется.
В целом размер табличного типа данных равен сумме размеров всех виртуальных элементов.
Табличные типы данных представляют таблицы методов, используемые в объектно-ориентированном программировании. С объектом связано обычно некоторое число методов, которые являются указателями на процедуры, работающие с экземплярами объектов. Процедуры методов могут либо вызываться непосредственно (статические методы), либо косвенно, через таблицу указателей процедур методов (виртуальные методы).
Для описания табличного типа данных в режиме Ideal можно использовать следующий синтаксис:
TABLE имя [элемент_таблицы [,элемент_таблицы.]]
Следующий синтаксис работает только в режиме MASM:
имя TABLE [элемент_таблицы [,элемент_таблицы.]]
Каждое поле "элемент_таблицы" имеет следующий синтаксис:
имя_таблицы
или [VIRTUAL] имя_элемента [[выражение_счетчика_1]] [: сложный_тип [:выражение_счетчика_2]] [=выражение]
где "имя_таблицы" - это имя существующего табличного типа данных, элементы которого целиком встраиваются в определяемую вами таблицу. Прибегайте к данному синтаксису, если вы хотите использовать наследование.
"Имя_элемента" - это имя элемента таблицы. Необязательное ключевое слово VIRTUAL указывает, что элемент является виртуальным, и ему нужно присвоить смещение.
"Сложный_тип" может представлять собой любое допустимое выражение сложного типа. Описание допустимых типов выражений можно найти в этом разделе.
Если вы не задается поле "сложный_тип", Турбо Ассемблер подразумевает, что это WORD (или DWORD, если текущей выбранной моделью является 32-разрядная модель).
Поле "выражение_счетчик_2" задает, сколько элементов данного типа определяется в таблице. Определение элемента таблицы:
foo TABLE VIRTUAL tmp:DWORD:4
определяет элемент таблицы с именем tmp, состоящий из 4 двойных слов.
По умолчанию, если вы его не задаете, "выражение_счетчика_2" имеет значение 1. Поле "выражение_счетчика_1" - это коэффициент размера элемента массива. Для элемента резервируется память, объем, которой определяется произведением "выражение_счетчик_2", длины, заданной полем "сложный_тип", и "выражения_счетчика_2". Если вы не задаете "выражение_счетчика_2", то по умолчанию его значение равно 1. Общее число элементов таблицы определяется произведением "выражение_счетчика_1" и "выражением_счетчика_2".
В режиме Ideal имена элементов таблицы являются локальными для таблицы, а в режиме MASM имеют глобальную область действия.
Поле "имя" задает имя табличного типа данных. Позднее вы можете использовать его в модуле для получения информации о табличном типе данных. Для получения информации можно также использовать имена отдельных элементов. Подробнее об этом рассказывается в этом разделе.
Табличные типы данных являются переопределяемыми. В модуле вы можете несколько раз определить табличный тип данных с одним и тем же именем. Подробнее об этом рассказывается здесь.
Кроме того, Турбо Ассемблер обеспечивает соответствующий синтаксис для определений табличного типа данных, в которых используется несколько строк.
Этот синтаксис аналогичен синтаксису перечислимого типа данных. Приведем пример:
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
1 2 3 4 5 6
8 8 8
| |