Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Организация ЭВМ.doc
Скачиваний:
130
Добавлен:
01.05.2014
Размер:
505.34 Кб
Скачать

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- не устанавливать связь или отменить ее, если она была установлена.

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

mov ax, seg d_seg ;seg- не обязательный оператор

mov ds, 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

LSRGE

Far

Far

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

(ds)=(ss)=DGroup

HAGE

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?

_BSS SEGMENT Word Public ‘BBS’

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

mov ax, @data

mov ds, ax