Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Полный текст учебника.docx
Скачиваний:
26
Добавлен:
17.04.2019
Размер:
10.83 Mб
Скачать

Основные директивы ассемблера

Напомним, что директивы (псевдооператоры) — это инструкции ассемблеру, они обрабатываются только при ассемблировании (трансляции) программы. Приведем некоторые из часто используемых директив.

Директивы определения идентификаторов

Присваивают идентификатору с данным именем некоторое текстовое или числовое значение (выражение). Формат директив:

имя EQU текст

имя = числовое значение (выражение)

Разница между псевдооператорами EQU и =:

  • EQU — присваивает значение постоянно (изменять нельзя), текст может быть символьным, числовым или смешанным выражением, определяющим константу, адрес, другое символьное имя, метку и т.д.;

  • = — выполняет текущее присваивание (значение может быть переназначено, но только при трансляции, естественно); присваивает только числовое выражение, содержащее простые математические преобразования, которые при трансляции и будут выполнены (например: const + 1, 15H*4, 3*12/4 и т.п.).

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

Используются для идентификации переменных и полей памяти. Формат директивы

[имя] D* выражение [,выражение] [,...].

Ключевые слова D* могут быть следующими:

  • DB — определить байт (1 байт);

  • DW — определить слово (2 байта);

  • DD — определить двойное слово (4 байта);

  • DQ — определить 8 байтов;

  • DT — определить 10 байтов.

Рассматриваемые директивы объявляют переменную (имя) или присваивают полям (ячейкам) памяти начальные значения; резервируют в памяти (с более поздним присвоением значения) один или несколько байтов — DB, слов — DW, двойных слов — DD и т.д.

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

  • константой: const DB 56; const DW 1936; const DD 3FFH. Обязательно следует учитывать диапазон и вместимость байта, слова и т.д.; так, для DB константа не может быть больше 255, для DW — 65 535, для DD —

  • 65 5352 – 1 = 4 294 967 295;

  • вектором или таблицей: table1 DB 30, 4, –15, 0, 0, 0, 56; table2 DW 1936, 3004, 56, 15. В одном псевдооператоре допускается поместить строку до 132 позиций, причем вместо повторения одного и того же значения несколько раз (0 в table1) можно использовать псевдооператор DUP (duplicate — дублировать): table1 DB 30, 4, –15, 3 dup(0), 56);

  • строкой символов: str1 DB 'Вы ввели слишком большое число'; str2 DB 'Bad command'; в псевдооператоре DB строка может содержать 255 символов, во всех остальных (DW, DD, DQ, DT) — только 2 символа.

  • пустым полем: pole1 DB ?; pole2 DW 12 dup(?), при этом в элементы резервируемой памяти при загрузке программы ничего не записывается (заносится не 0, как, например, в директиве pole3 DW 5 dup(0), а просто резервируются ячейки памяти);

  • символическим именем переменной: var1 DW disp; var2 DD vector (одна переменная определяется адресом другой, в директивах указывать offset не надо, поскольку имя переменной воспринимается как ее адрес). Такой вариант подходит, например, для хранения адресов ячеек памяти, меток, на которые допустимо ссылаться в программе (var1 DW disp), причем, если переменная находится в том же сегменте, что и ссылающаяся команда, то достаточно в качестве адреса указать только смещение (2 байта), то есть обойтись DW; если же переменная находится в другом сегменте, то необходимо указать и сегмент, и смещение (всего 4 байта), то есть следует использовать уже DD (var2 DD vector);

  • простым выражением: fn1 DB 80*3; fn2 DW (disp) + 256, вычисляемым, разумеется, только при трансляции программы.