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

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

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

· db — резервирование памяти для данных размером 1 байт.
Директивой db можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

§ для чисел со знаком –128...+127;

§ для чисел без знака 0...255;

o 8-битовое относительное выражение, использующее операции HIGH и LOW;

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

· dw — резервирование памяти для данных размером 2 байта.
Директивой dw можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

§ для чисел со знаком –32 768...32 767;

§ для чисел без знака 0...65 535;

o выражение, занимающее 16 или менее бит, в качестве которого может выступать смещение в 16-битовом сегменте или адрес сегмента;

o 1- или 2-байтовую строку, заключенная в кавычки.

· dd — резервирование памяти для данных размером 4 байта.
Директивой dd можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

§ для i8086:

§ для чисел со знаком –32 768...+32 767;

§ для чисел без знака 0...65 535;

§ для i386 и выше:

§ для чисел со знаком –2 147 483 648...+2 147 483 647;

§ для чисел без знака 0...4 294 967 295;

o относительное или адресное выражение, состоящее из 16-битового адреса сегмента и 16-битового смещения;

o строку длиной до 4 символов, заключенную в кавычки.

· df — резервирование памяти для данных размером 6 байт;

· dp — резервирование памяти для данных размером 6 байт.
Директивами df и dp можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

§ для i8086:

§ для чисел со знаком –32 768...+32 767;

§ для чисел без знака 0...65 535;

§ для i386 и выше:

§ для чисел со знаком –2 147 483 648...+2 147 483 647;

§ для чисел без знака 0...4 294 967 295;

o относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей микропроцессоров Intel);

o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;

o константу со знаком из диапазона –247...247–1;

o константу без знака из диапазона 0...248-1;

o строку длиной до 6 байт, заключенную в кавычки.

· dq — резервирование памяти для данных размером 8 байт.
Директивой dq можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

§ для МП i8086:

§ для чисел со знаком –32 768...+32 767;

§ для чисел без знака 0...65 535;

§ для МП i386 и выше:

§ для чисел со знаком –2 147 483 648...+2 147 483 647;

§ для чисел без знака 0...4 294 967 295;

o относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей микропроцессоров Intel);

o константу со знаком из диапазона –263...263–1;

o константу без знака из диапазона 0...264–1;

o строку длиной до 8 байт, заключенную в кавычки.

· dt — резервирование памяти для данных размером 10 байт.
Директивой dt можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

§ для МП i8086:

§ для чисел со знаком –32 768...+32 767;

§ для чисел без знака 0...65 535;

§ для МП i386 и выше:

§ для чисел со знаком –2 147 483 648...+2 147 483 647;

§ для чисел без знака 0...4 294 967 295;

o относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей);

o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;

o константу со знаком из диапазона –279...279-1;

o константу без знака из диапазона 0...280-1;

o строку длиной до 10 байт, заключенную в кавычки;

o упакованную десятичную константу в диапазоне 0...99 999 999 999 999 999 999.

Директивы резервирования и инициализации данных простых типов имеют формат:

[<имя >] Dx <выражение>

Выражение может быть:

1. Константой,

Perem1 DB 100

2. Последовательностью констант

Massiv DW 0,0,0,0,0; 5 элементов. Каждый по 2 байта.

3. Цепочкой символов, закл. в кавычки

Message DB ‘ Результат выполнения программы - ‘

4. Символическим именем (из поля <имя> этой или другой директивы)

Когда транслятор встречает директивы описания памяти с подобными операндами, то он формирует в памяти значения адресов тех переменных, чьи имена были указаны в качестве операндов. В зависимости от директивы, применяемой для получения такого адреса, формируется либо полный адрес (директива dd) в виде двух байтов сегментного адреса и двух байтов смещения, либо только смещение (директива dw).

perem2 dd 0f54d567ah

adr dw perem2

adr_full dd perem2

5. Вопросительным знаком?

например, Pole db?

Означает резервирование памяти без инициализации (присвоения нач. знач.)

Замеч. В памяти этот байт будет 00h.

6. Для повторения операндов можно использовать директиву DUP

(duplicate - повторять, дублировать)

Massiv1 dw 5 DUP (0)

Massiv2 db 10 DUP(0), 10 DUP (1)

Massiv3 db 3 DUP(0), 1,1

Massiv4 db 100 DUP(?)

Stroka db 10 DUP(‘ ‘)

В сегменте данных наряду с директивами резервирования и инициализации данных могут использоваться псевдооператоры EQU и = (директивы определения идентификаторов). Их можно отнести к простейшим макросредствам ассемблера.

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

Синтаксис псевдооператора EQU (equete -приравнивать).

<имя> EQU <строка или числовое выражение>

Синтаксис псевдооператора =

<имя> = <числовое выражение>

Отличия псевдооператоров:

1. С помощью EQU имени можно ставить в соответствие как числовые выражения, так и текстовые строки, а псевдооператор = может использоваться только с числовыми выражениями.

2. Идентификаторы, определенные с помощью =, можно переопределять в тексте программы, а определенные с помощью EQU - нельзя.

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

Size equ 10

Ak equ ax; переименовали регистр

length = 50

time = 24

time = time-2

Совет!! Псевдооператор = удобно использовать для определения простых абсолютных (т.е. не зависящих от места загрузки программы в память) математических выражений.

Например, adr1 db 10 dup (0)

adr2 db 1

dlina adr2-adr1

Очень важно уяснить себе порядок размещения данных в памяти. Он напрямую связан с логикой работы микропроцессора с данными. Микропроцессоры Intel требуют следования данных в памяти по принципу: младший байт по младшему адресу.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: