Директивы ассемблера ASM386/486, указанные в таблице 18-2, выделяют память для числовых переменных и констант. Как и другие директивы по распределению памяти, ассемблер связывает тип с любой переменной, определенной с помощью этих директив. Величина типа измеряется в единицах памяти - байтах(10 для DT, 8 для DQ). Ассемблер проверяет соответствие типа переменной, используемой в команде, самой команде. Например, команда FIADD ALPHA будет ошибочна, если тип переменной ALPHA имеет величину, не равную 2 или 4 байтам, так как целочисленное сложение определено только для данных типа слово или короткое целое (двойное слово). Тип операнда также сообщает ассемблеру какую машинную команду выполнять: хотя для программиста существует только одна команда FIADD, но для операндов различного типа требуются различные машинные команды.
Иногда разумно использовать команду с операндом, тип которого не объявлен. Например, если регистр BX содержит указатель на переменную типа короткое целое, то программист может пожелать определить команду FIADD [BX]. Это может быть достигнуто информированием процессора о типе операнда в команде, то есть FIADD DWORD PTR [BX]. Соответствующие преобразователи для других рапределений памяти - WORD PTR, QWORD PTR и TBYTE PTR.
Однако ассемблер не проверяет типы операндов, используемых в командах управления процессором. Команда FRSTOR [BP] подразумевает, что программист поместил в регистр BP указатель на место (возможно в стеке), в котором заранее была сохранена запись о состоянии процессора размером 94 байта.
Начальное значение для числовых констант может быть получено несколькими способами. Двоичные целые константы могут быть определены как битовые строки, десятичные целые, восьмеричные целые или шестнадцатиричные строки. Упакованные десятичные величины обычно записываются как десятичные целые, хотя ассемблер будет принимать и обрабатывать и другие представления целых. Вещественные величины могут записываться как обычные вещественные десятичные числа (с десятичной точкой), как десятичные числа в научной нотации или как шестнадцатиричные строки. Использование шестнадцатиричных строк первоначально было предназначено для определения специальных величин, таких как бесконечности, NaNs и ненормализованные числа. Большинство программистов найдут, что обычные и научные десятичные дают простейший способ инициализации числовых констант. На рисунке 18-2 дан пример, показывающий несколько способов пррисвоения данным различных числовых типов одной и той же начальной величины.
Таблица 18-2. Директивы распределения памяти ASM386/486. +---------------------------------------------------------------+| Директивы | Интерпретация | Типы данных |+-------------+----------------------+--------------------------|| DW | Определить слово | Целое слово || DD | Определить двойное | Короткое целое, короткое || | слово | вещественное || DQ | Определить слово | Длинное целое, длинное || | длиной 4 байта | вещественное || DT | Определить 10 байтов| Упакованное десятичное, || | | временное вещественное |+---------------------------------------------------------------+ +---------------------------------------------------------------+| || ; ПРИМЕР ОПРЕДЕЛЕНИЯ КОНСТАНТЫ -126 || ; || ;EVEN ; выравнение слов в памяти || WORD-INTEGER DW 111111111000010B ; битовая строка || SHORT_INTEGER DD 0FFFFFF82H ; шестнадцатиричная || ; константа должна || ; начинаться с цифры || LONG_INTEGER DQ -126 ; обычное десятичное || SINGLE_REAL DD -126.0 ; "научное" || DOUBLE_REAL DD -1.26E2 ; представление || PACKED_DECIMAL DT -126 ; обычное десятичное || ; целое || ; || ; в следующем определении 'C005' означает знак и порядок, || ; '7E00..00' - мантисса, 'R' информирует ассемблер, что || ; представленная строка вещественного типа || ; || EXTENDED_REAL DT 0C0057E00000000000000R || |+---------------------------------------------------------------+ Рисунок 18-2. Пример числовых констант.
Следует заметить, что числовые переменные и константы, следующие за директивой EVEN, дают уверенность, что операнды будут представлены выравненными словами. Наилучшее представление получается, когда данные преобразуются к двойным словам, расположенным линейно. Все числовые типы данных занимают целое число слов, так что если блоки переменных объявляются вместе и перед декларативной частью указано слово EVEN, то память не растрачивается попусту.