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

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

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

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

Также может быть использована конструкция повторения константы. DUP(n) – где n, число, показывающее количество повторений константы и соответственно количество выделяемой памяти, которое нужно для их размещения. Рассмотрим примеры:

  1. var1 db 0ffh,255,11111111b

Первый байт 0ffh будет  иметь адрес var1.

Второй байт 255 будет иметь адрес var1+1

Третий байт 11111111bбудет иметь адрес var1+2

  1. var2 dw 3a7fh

Данная директива резервирует слово – два байта. В этом случае младшим байтом будет являться 7f, а старшим байтом – 3a.

  1. arr1 db 10 dup(“ “)

Директива повторения. В данном случае будет зарезервировано 10 байтов, которые будут заполнены пробелами.

  1. arr2 db 5 dup(?).

Опять директива повторения. Будет выделено пять не инициализируемых байтов, т. е. в них останутся предыдущие значения, так как параметров dupявляется вопросительный знак.

  1. a1 db 3 dup (5 dup(7))

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

С помощью директив определения данных можно определять и адресные константы.

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

Директивы определения символьных строк

Директива db– единственная директива, которая записывает данные в том виде, в котором вы их указываете в строковой константе. То есть при выражении strdbzpb’ будет записано в память сначала z, потом p, и наконец b.

Директива ddрезервирует двойное слово, то есть 4 байта. В качестве ее значения также можно указать символьную строку, но она будет записана в память уже в другом порядке.

При выражении strzddpc’, pбудет записано в старший байт младшего слова.

Для символьных цепочек также можно использовать директиву dw. В выражении var3 dwvar1var3 будет записано смещение var1. А при использовании директивы ddв выражении var4 ddvar1, в var4 будет записан указатель var1: сегмент будет записан по старшему адресу, смещение будет записано по младшему адресу.

Директива EQU

Синтаксис данной директивы: Имя EQUвыражение.

Эта директива  определяет выражение, которое будет подставляться вместо имени, то есть заменяет имя на эквивалентное выражение (аналогична директиве #defineв языке С++). Подстановка происходит в процессе предпроцессорной обработки программы, то есть до ее компиляции.

Выражение может быть произвольным, вплоть до того, что имени можно присвоить целую команду (см. примеры на рисунке).

Близкая по свойствам директиве EQU, является директива «=». Она имеет синтаксис: имя = числовое выражение. Выражение может быть числовым, а также содержать переменные.

Директива LABEL

Эта директива позволяет переопределить атрибут для указанного имени. Директива имеет синтаксис: имя LABELтип. Например: FCOMLABELFAR– имени FCOMприсваивается тип FAR. Это значит, что на следующую команду мы можем передать управление даже вне сегмента (movdx,0).

Данная директива позволяет также создать указатели разных типов на одни и те же данные. Рассмотрим строки:

B_TABLABELBYTE

W_TABDW 2E25H,43H,0015H

То есть не смотря на то, что W_TABимеет тип DW, мы можем обратиться к этим данным как к данным с типом BYTE, используя метку B_TAB, которую мы объявили типа BYTE с помощью директивы LABEL.

Директива управления программным

Ссылка на основную публикацию
Adblock detector