Скачиваний:
23
Добавлен:
11.05.2015
Размер:
998.91 Кб
Скачать

8.3. Непосредственные операнды

Непосредственные операнды — число, строка, имя или выражение, имеющие некоторое фиксированное значение.

Метка equ выражение

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

Например:

t equ 1

mess equ ‘try again $’

v equ 4[si]

CMP ax,t ; CMP ax,1

Db mess ; db ‘try again $’

MOV ax,v ; MOV ax, 4[si]

= — эквивалентно equ, но определяемая им метка может принимать целочисленное значение, а метка, определенная равенством, может быть переопределена.

Метка $ — предопределенная метка, всегда соответствует текущему адресу.

8.4. Структуры

Директива STRUC позволяет определять структуру данных аналогично структурам в языках высокого уровня.

Последовательность директив определяет структуру:

Имя struc

«Поля»

Имя ends,

где поля представляют любой набор директив, определяющих переменные или структуры.

Для создания такой структуры в памяти ее необходимо инициализировать следующим образом:

[метка] имя <[значения]>

Пример:

pn struc

x dw 0

y dw 0

z dw 0 шаблон структуры

c26 db 3 dup (?)

pn ends

cr_pn pn <1,1,1,125,255,0> - инициализация структуры. Значения в угловых скобках не обязательны. Если их нет, то выбираются значения из шаблона. Т.е. может быть выражение вида: cr_pn pn < >. Можно задать часть значений. В этом случае значения в угловых скобках перечисляются через запятую. Доступ к элементу структуры осуществляется через оператор  (точка). Cr_pn x - доступ к элементу х.

8.5. Сегменты

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

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

Сегмент программы описывается директивами

SEGMENT и ENDS

имя сегмента segment выравнивание тип разряд класс

имя сегмента ends

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

byte

– c любого адреса;

word

– с четного адреса;

Dword

– с адреса, кратного 4;

Para

– с адреса, кратного 16 (граница параграфа);

Page

– с адреса, кратного 256;

Mempage

– с адреса, кратного 4 Кбайта.

По умолчанию используется выравнивание по границе параграфа.

Тип — указание для редактора связей, как комбинируются сегменты.

PUBLIC (синоним MEMORY)  все сегменты с одинаковым именем, но разными классами будут объединены в один.

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

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

АТ — сегмент располагается по фиксированному абсолютному адресу памяти. Адрес кратен 16, т.е. длине параграфа. Обычно такой сегмент содержит только метки, указывающие на области памяти, которые могут потребоваться программе.

PRIVATE (значение по умолчанию) — сегмент не объединяется с другими сегментами.

Разрядность: принимает значения USE16 и USE32. В первом случае размер сегмента не более 64 Кб. Все команды и адреса считаются 16-битными, но можно применять 32-битные и ссылаться на 32-битные данные. Во втором случае размер сегмента до 4Гб. Команды и адреса 32-битные.

По умолчанию используется USE16, если перед директивой MODEL не использовалась директива задания набора команд .386 и старше.

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

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

Если в программе определено много сегментов, то их удобно объединить в группу, адресуемую с помощью одного сегментного регистра:

Имя группы group имя сегмента (список сегментов).

Common segment para common ‘data’

Common ends

Pdata segment para pablic ‘ddt’

Pdata ends

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

ASSUME

Assume регистр: связь...

Assume cs: cod, DS: data, ss: STACK, ES: DATASG

Если связать, используя директиву, аssume и ключевое слово nothing (ничего), то в этом случае назначения регистров сегментов аннулируются:

Assume nothing

cs: cod, DS : d at, es: nothing

Соседние файлы в папке Введение в вычислительную технику.