Директивы определения данных
Для описания простых типов данных в языке ассемблера используются специальные директивы резервирования и инициализации данных, которые, по сути, являются указаниями транслятору на выделение определенного объема памяти. Машинного эквивалента этим директивам нет; просто транслятор, обрабатывая каждую такую директиву, выделяет необходимое количество байт памяти и при необходимости инициализирует эту область некоторым значением. Директивы резервирования и инициализации данных имеют формат, показанный на рис.5.5.
Рис. 5.5. Директивы определения данных
Рассмотрим, каким образом может задаваться выражение в директивах определения данных:
– «?» показывает, что содержимое поля не определено, то есть при задании директивы с таким значением выражения содержимое выделенного участка физической памяти изменяться не будет. Фактически создается неинициализированная переменная;
– значение инициализации – значение элемента данных, которое будет занесено в память после загрузки программы. Фактически создается инициализированная переменная, в качестве которой могут выступать константы, строки символов, константные и адресные выражения в зависимости от типа данных;
– имя – некоторое символическое имя метки или ячейки памяти в сегменте данных, используемое в программе. В этом случае значением директивы окажется эффективный адрес метки или ячейки памяти.
При необходимости задания нескольких одинаковых значений выражений одной директивой, используется ключевое слово dup (от англ. DUPlicate – копировать) с указанием числа повторений (разделены пробелом).
Если требуется задать одной директивой некую совокупность (массив) различных выражений, то последние перечисляются через запятую.
Директива определения байта (DB).
Директива предназначена для резервирования памяти для данных размером 1 байт. Директивой DB можно задавать выражение или константу, принимающую значение из диапазона: –128...+127 (для чисел со знаком) или 0...255 (для чисел без знака), а также символьную строку произвольной длины. Строка заключается в кавычки (см. разд.4) и в этом случае выделяется столько байт, сколько символов в строке. Каждый символ в памяти хранится в ASCII коде.
Примеры использования директивы:
fld1db DB ? ;Неопределенное значение
fld2db DB 'Personal Computer' ;Символьная строка (17 символов)
fld3db DB 20H ;Числовая константа
fld4db DB '32654' ;Символьная константа
fld5db DB 10 DUP(0) ;Десять нулей
fld6db DB 7 DUP(10 DUP(3) ;Семьдесят троек
fld7db DB 11, 12, 13, 14, 15, 16 ;Числовой массив
В последнем примере транслятор определяет константы в виде последовательности смежных байт. Ссылка по имени fld7db указывает на первую константу (11), по fld7db+1 – на вторую (12) и т.д. (см. рис.5.6).
Рис. 5.6. Размещение массива однобайтовых элементов в памяти
Например, следующая команда загружает в регистр AL значение 14D:
MOV AL,fld8db +3
Директива определения слова (DW).
Директива предназначена для резервирования памяти для данных размером 2 байта (1 слово). Директивой DW можно задавать выражение или константу, принимающую значение из диапазона: –32 768...+32 767 (для чисел со знаком) или 0...65 535 (для чисел без знака), а также символьную строку, но только из одного или двух символов.
Примеры использования директивы:
fld1dw DW 2BF0H ;Числовая константа
fld2dw DW fld7db ;Адресная константа
fld3dw DW 'PC' ; Символьная строка
fld4dw DW 12345D ;Числовая константа
fld5dw DW 3456H, 5AFFH, 9C67H ;Числовой массив
Директивой fld2dw инициализируется не значение директивы fld7db (в отличие от использования этого имени, например, в команде MOV), а ее эффективный адрес (смещение относительно начала сегмента данных), так как данные не могут пересылаться между двумя ячейками памяти напрямую.
В памяти данные размером в слово хранятся в обратном порядке. Например, десятичное значение 12345D в директиве fld3dw преобразуется в шестнадцатеричное 3039H, но в памяти хранится как 3930H.
В последнем примере отдельные значения массива занимают смежные пары ячеек в памяти. При этом данные хранятся в обратном порядке и адресом слова является адрес его младшего байта (см. рис.5.7). Это необходимо учитывать, если требуется обращаться к отдельным байтам слова.
Рис. 5.7. Размещение массива двухбайтовых элементов в памяти
Директива определения двойного слова (DD).
Директива предназначена для резервирования памяти для данных размером 4 байта (2 слова). Директивой DW можно задавать выражение или константу, принимающую значение из диапазона: –2 147 483 648...+2 147 483 647 (для чисел со знаком или от FFFFFFFFH до 7FFFFFFFH) или 0...4 294 967 295 (для чисел без знака или от 0 до FFFFFFFFH), а также символьную строку длиной до четырех символов.
Примеры использования директивы:
fld1dd DD 32572 ;Числовая константа
fld2dd DD 12EFH ;Числовая константа
fld3dd DD fld3db – fld2db ;Разница адресов (17)
fld4dd DD 12345D ;Числовая константа
В поле fld3dd вычисляется разница между двумя адресами, в данном случае результатом является длина поля fld2db.
Аналогично десятичное значение 12345D в директиве fld4dd преобразуется в 00003039H, но в памяти хранится как 39300000H.
Директива определения учетверенного слова (DQ).
Директива DQ определяет элементы, имеющие длину четыре слова (восемь байт).