Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОргЭВМ 2 курс 1 сем / comput_org_2018 / Теория / Уч_пос_АрхКомп_2017.docx
Скачиваний:
53
Добавлен:
01.09.2020
Размер:
626.15 Кб
Скачать

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

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?

_BSS SEGMENT Word Public ‘BBS’

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

mov ax, @data

mov ds, ax