Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ по Асм №1.doc
Скачиваний:
12
Добавлен:
06.02.2016
Размер:
313.86 Кб
Скачать

1.5.3. Директивы

Помимо команд в программе ЯА надо указывать и другие вещи, например, константы, переменные. Это делается с помощью директив.

Синтаксис:

[<имя>] <название директивы> [<операнды>] [;<комментарий>]

Имя, указанное в начале директивы – это, как правило, имя константы или переменной.

Название директивы, как и команда, служебное слово.

1.6. Директивы определения данных

Они применяются для описания переменных, с которыми работает программа. В зависимости от размера переменной (байт, слово, 2 слова) используется необходимая директива.

1.6.1. Директива db

По директиве DB (definebyte, определить байт) определяются данные размером в байт.

Синтаксис:

[<имя>] DB <операнд> {, <операнд>}

Встречая такую директиву, ассемблер вычисляет операнды и записывает их значения в последовательные байты памяти. Первому из этих байтов дается указанное имя, по которому на этот байт можно ссылаться из других мест программы.

Существует два способа задания операндов директивы DB (остальные способы производны):

  • ? (знак неопределенного значения);

  • константные выражения от –128 до 255.

Операнд ?

Например, Х DB ?

По этой директиве описывается переменная Х. Для нее отводится один байт памяти, в который ничего не записывается. Ассемблер запоминает адрес этого байта. Если в программе встретится имя этой переменной, то он заменит его на этот адрес (в этом и заключается трансляция имен).

Адрес ячейки, выделенной переменной с именем Х, принято называть значением имени Х (не путать с содержимым ячейки памяти). Кроме того, по описанию переменной ассемблер запоминает, сколько байтов занимает переменная в памяти. Этот размер называется типом имени переменной. Таким образом, значение (адрес) и тип (размер) переменной однозначно определяет ячейку, обозначенную этим именем.

В ЯА имеется оператор типа.

Синтаксис:

Type <имя>

Значением этого оператора является размер ячейки (в байтах), выделенной под переменную с указанным именем. Если переменная описана по директиве DB, то для ее имени значение этого оператора равно 1. В ЯА имеется стандартная константа с именем Byteи значением 1.

Операнд – константное выражение от –128 до 255

ЯА позволяет в качестве операндов записать выражение. Оно будет вычислено и результат запишется в ячейку. Таким образом, мы не только создаем переменную (отводим ячейку), но и сразу заносим значение.

В простейшем случае начальное значение задается в виде числа с величиной от –128 до 255.

Например:

А DB 254 ; 0FEh

B DB -2 ; 0FEh (=256-2=254)

Операнд-число, естественно, переводится в двоичную систему.

В другом случае в качестве начального значения переменной указывается символ. При этом в качестве операнда можно указать как сам символ, так и его код. Например, эти директивы эквивалентны:

Q DB 2Ah Q DB ‘*’

Важно отметить, что если указать в качестве операнда число, выходящее за рамки (-128, 255), то ассемблер зафиксирует ошибку.

Директива с несколькими операндами

Выше рассмотренные способы применены к описанию скалярных переменных. Если же потребуется описать массив из 4 байт, то это можно сделать так:

M DB 2, -2, ?, ‘*’.

По директиве DB с несколькими операндами ассемблер выделяет в памяти соседние байты памяти, по одному на каждый операнд, и записывает в эти байты значение операндов. В нашем случае память заполнится так:

М

02

0FEh

2Ah

Замечание.Имя, указанное в начале директивы, именует только первый из этих байтов. Остальные байты –безымянные. Для ссылок на них в ЯА используется выражение вида <имя>+ К, где К – целое число. Например, М+1 для ссылки на байт со значением 0FEhи т.п. Не следует понимать запись М+1 как сложение содержимого ячейки с 1. В ЯА запись <имя>К означает, что к адресу нужно прибавить или отнять число К, в результате чего получится некий новый адрес. Таким образом, данная запись означает сложение/вычитание адресов.

Операнд-строка

Возможно еще оно сокращение в директиве DB: если в ней несколько соседних операндов – символы, то их можно объединить в одну строку. Например, следующие директивы эквивалентны:

S DB ‘a’, ‘b’, ‘c’ S DB ‘abc’

S DB ‘ab’, ‘c’ S DB ‘a’, ‘bc’

В этом случае произойдет такое же заполнение памяти, как и в предыдущем случае. Также, TypeS=Byte, то естьS– имя ячейки с кодом символа ‘a’.

Операнд-конструкция повторения DUP

Рассмотрим еще одно сокращение. Зачастую в директиве приходится указывать одинаковые операнды. Например, описание массива R из 8 элементов с занесением нулей:

R DB 0,0,0,0,0,0,0,0

Эту директиву можно записать короче:

R DB 8 DUP(0)

Здесь в качестве операнда используется конструкция повторения, которая в общем случае имеет вид:

K DUP (P1, P2, …, Pn),

где К – константное выражение с положительным значением, n>=1, Pi – любой допустимый операнд. Например, директивы слева и справа эквивалентны:

X DB 2 DUP (‘ab’, ?, 1) X DB ‘ab’, ?, 1, ‘ab’,?,1

Y DB -7, 3 DUP (0, 2 DUP(?)) Y DB -7,0,?,?,0,?,?,0,?,?

Замечание. Вложенность конструкции DUP можно использовать для наглядного описания многомерных массивов.

Hапример:

A DB 20 DUP (30 DUP (?))

Описывает массив А размерностью 2030.