Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Организация и функционирование вычислительных машин1.doc
Скачиваний:
37
Добавлен:
01.05.2014
Размер:
1.13 Mб
Скачать

2. Директивы сегментации программы

Два способа задания сегментов в программе.

Полное описание сегментов

имя_сегмента SEGMENT атрибуты

тело сегмента

имя_сегмента ENDS

Пример

dat_s1 segment byte public ‘data’

a db ?

dat_s1 ends

Атрибуты:

  • ReadOnly- сегмент доступен только для чтения; при попытки записи в этот сегментMASMвыдаст сообщение об ошибке.

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

BYTE- с любого адреса.

WORD- с четного адреса.

DWORD- с адреса, кратного 4.

PARA- с адреса, кратного 16 (установлен по умолчанию).

PAGE-с адреса, кратного 256.

  • Атрибут группирования, комбинирования.

PUBLIC- конкатенация (присоединение частей сегментов друг к другу).

COMMON- размещение сегментов данного класса с одного адреса (для сегментов кода и оверлейных программ).

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

  • Атрибут типа данных.

USE16- сегмент работает с 16 битными данными.

USE32- сегмент работает с 32 битными данными.

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

Связь сегментов с соответствующими сегментным регистром.

ASSUME{регистр_сегментный: имя_сегмента,…}

Обычно эта директива идет вслед за сегментом кода.

Пример

assume cs: code_s, ds: d_seg,

ss: stack, es: nothing

NOTHING- не устанавливать связь или отменить ее, если она была установлена.

Загрузка начальных адресов сегментов в соответствующие регистры.

movax,segd_seg;seg- не обязательный оператор

movds,ax

3. Директивы группирования.

GROUPимя_сегмента1, имя_сегмента2,…

Все перечисленные сегменты относятся к одной группе и могут адресоваться относительно одного регистра (обычно в одну группу объединяют сегменты одного назначения, например, dataиstack).

Сокращенное описание сегментов.

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

.MODELтип_модели_памяти

Эта директива накладывает ограничения на комбинирование сегментов

Модель

Тип доступа к коду

Тип доступа к данным

Сегментные регистры

Примечания

TINY

Near

Near

(cs)=DGroup

(ds)=(ss)=DGroup

.com

SMALL

Near

Near

(cs)=_Text

(ds)=(ss)=DGroup

.exe

MEDIUM

Far

Near

(cs)=<имя_сегмента>_Text

(ds)=(ss)=DGroup

LARGE

Far

Far

(cs)=<имя_сегмента>_Text

(ds)=(ss)=DGroup

HUGE

Far

Far

.CODE- директива описания сегмента кода; эта запись аналогична

_TEXT SEGMENT Word Public ‘CODE’

или

<имя_сегмента> _TEXT Word Public ‘CODE’

для модели памяти выше MEDIUM

.DATA

_DATA SEGMENT Word Public ‘DATA’

.STACK

STACK SEGMENT Para Public ‘STACK’

.CONST

CONST SEGMENT Word Public ‘CONST’

.DATA?

_BSSSEGMENTWordPublic‘BBS’

Отличие от полного описания сегментов заключается в отсутствии директивы ENDS. Таким образом, в результате создаются предопределенные переменные, которые содержат начальные адреса сегментов: @Code, @Data, @Stack, @Const, @BBS. Следовательно можно написать:

mov ax, @data

mov ds, ax