Отметим попутно, что в массивах имя обычно дается только его первому элементу, а остальные оставляют безымянными, поэтому-то в нашем примере имя указано лишь в первой директиве.
Если в директиве DB не указано имя, то по ней байт в памяти отводится, но он остается безымянным.
Ясно, что, если в массиве много элементов, то такой способ описания массива слишком громоздок.
Поэтому в ЯА допускается упрощенная форма описания массивов, когда он описывается одной директивой, но с несколькими операндами - со столькими, сколько элементов в массиве.
вместо наших 4 директив можно выписать только одну:
М DB 2,-2,?,'*'
По директиве DB снесколькими операндами ассемблер выделяет в памяти соcедние байты памяти, по одному на каждый операнд,
и записывает в эти байты значения операндов (для операнда ? ничего не записывает).
В нашем примереассемблер следующим образом заполнит память:
М
02 FE 2A
Отметим, что имя, указанное в начале директивы, именует только первый из тих байтов.
В связи с этим тип имени М равен 1:
TYPE М = BYTE .
Остальные же байты остаютсябезымянными.
Для ссылок на них в ЯА используются выражения вида М+k,где k - целое число:
М+1 - для ссылки на байт со значением FE,
М+2 - для ссылки на следующий байт и т. д.
Особо подчеркнем, что запись
М+1 не следует понимать как сложениесодержимого ячейки с именем М ( т. е. числа 2) с числом 1.
<имя>±k
- означает, что к адресу указанного имени надо прибавить (или отнять) число k,
- в результате чего получится некоторый новый адрес,
- и вот уже по этому адресу и осуществляется доступ к памяти. Таким образом, данная запись означает сложение/вычитание адресов.
Возможно еще одно сокращение в директиве DB:
- если в ней несколько соседних операндов - символы, то их можно объединить в одну строку.
следующие две директивы эквивалентны:
S DB 'a','b','c' S DB 'abc'
Отметим, что и в этом случае тип имени равен 1 (TYPE S = BYTE), т. к. любая из этих директив является сокращением следующих трех директив:
S DB 'а'
DB 'b'
DB 'c'
а здесь ясно видно, что имя Sобозначает только первый байт.
Вопрос о том, объединять соседние символы в одну строкуили нет, а если объединять, то какие именно, решает сам автор программы.