Программирование на Ассемблере


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


Код директивы определяет тип данного, для которого выделяется память.

В табл. 4.1 определены директивы для выделения памяти и соответствующие типы данных для языка С.

Таблица 4.1. Директивы выделения памяти

Код директивы

Размер данного (байт)

Тип соответствующего данного в языке С

DB



1

char

DW

2

short

DD

4

int, unsigned, float

DF, DP

6

-

DQ

8

double, int64

DT

10

long double

При выделении памяти допускается инициализировать выделенную область и не инициализировать ее. Для правильной работы программы первая переменная в сегменте данных DATASEG должна быть инициализирована. Если переменная инициализируется, в поле операнда задается ее значение, если не инициализируется, ставится знак ? вместо соответствующего значения. Одной переменной может соответствовать несколько значений (массив). Среди элементов массива могут быть инициализированные и неинициализированные элементы. Под адрес всегда отводится 4 байта (данное типа DD). Для инициализации адреса достаточно в поле операнда задать имя данного, для которого определяется адрес.

Примеры директив.

Оттранслировать директивы с языка С++ на ассемблер, если память выделяется в сегменте данных:

char     c1 = ‘a’, c2, c3 = «bcde»;

short    s1 = 2, s2[] = {1,2,3};

unsigned short s2 = 60000;

int        i1[]={7, 3, -2, 4};

float     f1 = 5, f2;

double d1 = 5, d2, d3 = 7e-20;

long     double ld1 = 3, ld2[5];

int *p = i1, *q;

DATASEG

;char c1 = ‘a’, c2, c3 = «bcd»;

c1        db        ‘a’

c2        db        ?

c3        db        «bcd», 0

;short   s1 = 2, s2[] = {1,2,3};

s1         dw       2

s2         dw       1, 2, 3

;unsigned short s3 = 60000;

s3         dw       60000

; int      i1[]={7, 3, -2, 4};

i1         dd        7, 3, -2, 4

;float    f1 = 5, f2;

f1         dd        5.;

f2         dd        ?

;double d1 = 5, d2, d3 = 7e-20;

d1        dq        5.;

d2        dq        ?

d3        dq        7e-20

; long   double ld1 = 3, ld2[5];

ld1       dt         3.;

ld2       dt         5 dup (?)

;int *p = i1, *q;

 p         dd        i1

q          dd        ?

Обратите внимание на задание адресов!

Заметим, что директивы для выделения памяти под c1 .. d3 лучше поменять местами, так как в этом случае доступ к переменным выполняется быстрее с учетом выравнивания адресов.



Содержание раздела