Для описания переменных в языке ассемблера используются
директивы определения данных.
Директива DB(DefineByte, определить байт) определяет данные размером в байт:
[<имя>] DB <операнд> {,<операнд>}
Встречая директиву DB, ассемблер вычисляет операнды и записывает их значения в последовательные байты памяти. Первому из байтов дается имя, по которому на него можно потом ссылаться.
Существует два основных способа задания операндов директивы DB:
- неинициализированное начальное значение ? (знак неопределенного значения);
- константное выражение со значением от -128 до 255.
XDB?
По этой директиве переменной X отводится один байт памяти, в который ничего не записывается. Ассемблер запомнит адрес переменной и когда он встретится в тексте, заменит его на данный адрес (выполнит трансляцию имен). Адрес ячейки, выделенной переменной с именем X, принято называть значением имени X (в отличие от содержимого ячейки по этому адресу).
По описанию переменной ассемблер определяет, сколько байт занимает переменная в памяти. Этот размер называется типом переменной.
Значение(
адрес) и
тип(
размер) переменной однозначно определяют ячейку, обозначаемую именем.
С одного и того же адреса могут начинаться ячейки размером байт, слово или двойное слово, поэтому кроме начального адреса ячейки обычно требуется знать и ее размер. В языке ассемблера существует оператор типа:
TYPE <имя>
Значением оператора является размер (в байтах) ячейки, выделенной под переменную с указанным именем. Если переменная описана по директиве DB, то для ее имени значение оператора равно 1. В языке ассемблера есть стандартная константа с именем BYTE и значением 1:
ТУРЕ X = BYTE = 1
Для определения переменной с начальным значением в качестве операнда в директиве DB указывается выражение, которое ассемблер вычислит, и значение которого запишет в ячейку памяти. В наиболее распространенном случае начальное значение байтовой переменной задается в виде числа с величиной от -128 до 255:
A DB 254 ; 0FEh
В DB -2 ; 0FEh (256-2=254)
По каждой из директив ассемблер отводит один байт и записывает в него указанное число. Причем неотрицательные числа записываются как беззнаковые, а отрицательные записываются в дополнительном коде.
В качестве начального значения переменной можно указать символ, записав его числовой код, либо сам символ в кавычках. Например, в кодировке ASCII код символа «*» равен 2Ah, поэтому следующие две директивы эквивалентны:
S DB 2Ah
S DB "*"
Во втором случае ассемблер определит код символа и запишет его в ячейку памяти.
С помощью директивы DB можно описать двоично-десятичные числа:
PACK DB 01h, 23h ; число 123 в упакованном формате
UNPACK DB 1, 2, 3 ; число 123 в неупакованном формате
Для представления числа в упакованном формате необходимо указывать две цифры обязательно в шестнадцатеричной системе счисления для трансляции каждой цифры в тетрады.
Другим более удобным способом описания является применение ASCII-чисел – записи чисел в виде символьных строк (например, ‘123’). В кодировке ASCII символьные цифры от ‘0’ до ‘9’ имеют коды от 30h до 39h. Поэтому преобразования таких символьных чисел в двоично-десятичные выполняется путем выделения младшего полубайта кода, а обратное преобразование – путем сложением с 30h.
С помощью директивы DB можно описать массив. Например, байтовый массив A из 8 элементов с начальным значением 0 для каждого из них можно определить так:
A db 0, 0, 0, 0, 0, 0, 0, 0
Директиву можно записать иначе:
A DB 8 DUP(0)
В качестве операнда здесь использована конструкция повторения, в которой сначала указывается коэффициент повторения, а затем служебное слово DUP (duplicate, копировать) и в круглых скобках повторяемая величина:
k DUP (p1, р2,..., pn)
где
k - константное выражение с положительным значением, n 1;
рi- любой допустимый операнд директивы DB (возможна вновь конструкция повторения).
Данная запись является сокращением для k раз повторенной последовательности указанных в скобках операндов.
Вложенность конструкций DUP позволяет задать многомерные массивы. Например, байтовая матрица А размера 5x10 (10 байт в строке, 5 строк) имеет вид:
A DB 5 DUP(10 DUP(?))