Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Опорний конспект лекцій_ Асемблер.Docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
506.89 Кб
Скачать
      1. Директиви сегментації

МП має шість сегментних регістрів через які він працює з одним сегментом коду, з одним сегментом стека, з одним сегментом даних і трьома додатковими сегментами даних. Для об’єднання програм на різних мовах призначені операнди в дерективі SEGMENT. Синтаксис: Ім’я_сегмента SEGMENT [Тип вирівнювання] [Тип комбінування] [Клас_сегмента] [Тип_розмірності_сегмента]

...

Ім’я_сегмента ENDS

Тип вирівнювання початку сегмента на заданій межі:

  • BYTE – без вирівнювання; Сегмент може починатися з любого адресу пам’яті.

  • WORD – сегмент починається по адресу кратному двом (один молодший біт фізичного адреса 0) (вирівнювання на межу слова);

  • DWORD – сегмент починається по адресу кратному чотирьом (два молодших біти фізичного адреса 0), (вирівнювання на межу подвійного слова);

  • PARA – сегмент починається по адресу кратному 16 (остання шістнадцяткова цифра 0h) (вирівнювання на межу параграфа);

  • PAGE – сегмент починається по адресу кратному 256 (дві останні шістнадцяткові цифри 00h) (вирівнювання на межу сторінки);

  • MEMPAGE – сегмент починається по адресу кратному 4 Кбайт (три останні шістнадцяткові цифри 000h) (вирівнювання на межу сторінки 4 Кбайт).

Тип комбінування сегментів різних модулів з одним іменем:

  • PRIVATE – сегмент не буде об’єднуватися з другими модулями з ти же іменем поза даним модулем;

  • PUBLIC – заставляє компонувач об’єднати всі сегменти з однаковим іменем; Новий об’єднаний сегмент буде цілим і неперервним. Всі адреси (зміщення) об’єктів (команд або даних) будуть обчислюватися відносно початку цього нового сегмента.

  • COMMON – розмістити всі сегменти з одним і тим же іменем по одному адресу; Всі сегменти з даним іменем будуть перекриватися і сумісно використовувати пам’ять. Розмір отриманого сегменту буде дорівнювати розміру самого більшого сегменту.

  • Atxxxx – розмістити сегмент по абсолютному адресу параграфа xxxx (наприклад доступ до відеопам’яті або області постійного запам’ятовуючого пристрою); Для доступа до сегмента необхідно в сегментний регістр занести значення заданого абсолютного адреса xxxx. Всі мітки і адреси відраховуються відносно заданого абсолютного адреса.

  • STACK – визначення сегментна стека. Заставляє компонував об’єднати всі однойменні сегменти і обчислити адреси в цих сегментах відносно регістр ss. Тип STACK аналогічний до типу PUBLIC, за винятком того, що регістра ss є стандартним сегментним регістром. Регіст sp встановлюється на кінець об’єднаного сегмента.

Клас сегмента – це строка в лапках, яка допомагає компоновану визначити відповідний порядок слідування сегментів при зборці програми із сегментів декількох модулів.

Тип розміру сегмента – задає розмір сегмента і порядок формування фізичного адресу. Для процесорів i80386 і вище сегменти можуть бути 16- і 32-розрядними. Це впливає на розмір сегмента і порядок формування фізичного адресу всередині нього. Можливі значення:

  • USE16 – 16-розрядна адресація. Фізичний адрес із 16-розрядним зміщенням.

Сегмент може містити до 64 Кбайт коду або даних;

  • USE32 – 32-розрядна адресація. Фізичний адрес із 32-розрядним зміщенням.

Сегмент може містити до 4 Гбайт коду або даних.

Всі сегменти рівноправні, так як директиви SEGMENT і ENDS не містять інформацію про функціональне призначення сегментів. Щоб повідомити транслятору, які сегменти відносяться до коду, даних або стека використовують директиву ASSUME. Ця директива повідомляє про прив’язку сегмента до сегментних регістрів. Синтаксис:

ASSUME: [nothing] [[cs:ім’я_сегмента], [nothing]] [[ds:ім’я_сегмента], [nothing]] [[ss:ім’я_сегмента], [nothing]] [[es:ім’я_сегмента], [nothing]] [[fs:ім’я_сегмента], [nothing]] [[gs:ім’я_сегмента], [nothing]]

Якщо в якості операнду використовується слово nothing, то попередні значення всіх шести регістрів анулюються. Якщо слово nothing використовується замість аргументу ім’я сегмента, то в цьому випадку вибірково розривається зв’язок між сегментом і відповідним регістром.

Для простих програм, які мають по одному сегменту коду, даних і стека використовують спрощені директиви вказання моделі пам’яті (MODEL) і сегментації. Синтаксис директиви модель:

MODEL [модифікатор] модель_пам’яті [ім’я_кодового_сегмента] [, [мова] [модифікатор_мови]] [,модифікатор]

Модифікатори моделі пам’яті:

o use16 – сегменти вибраної моделі використовуються як 16-бітні; o use32 – сегменти вибраної моделі використовуються як 32-бітні; o dos – програма для DOS.

Моделі пам’яті

Таблиця 2.1.

Модель

Тип кода

Тип даних

Призначення моделі

TINY

near

near

Код і дані об’єднані в одну групу DGROUP, для створення

програм формату .com

SMALL

near

near

Код займає один сегмент, дані об’єднані в одну групу

DGROUP

MEDIUM

far

near

Код займає декілька сегментів, по одному на модуль; дані об’єднані в одну групу

COMPACT

near

far

Код в одному сегменті

LARGE

far

far

Код в декількох сегментах, по одному на модуль

FLAT

near

near

Код і дані в одному 32-бітному сегменті (плоска модель пам’яті)

При використанні директиви MODEL транслятор робить доступними декілька ідентифікаторів, до яких можна звертатися під час роботи програми:

@code – фізичний адрес сегмента коду;

@data – фізичний адрес сегмента даних типу near

@fardata - фізичний адрес сегмента даних типу far

@fardata? - фізичний адрес сегмента неініціалізованих даних типу far

@stack - фізичний адрес сегмента стека.

Спрощені директиви вказання сегменту

Таблиця 2.2

Формат директиви

Призначення

Режим MASM

Режим IDEAL

.CODE [ім’я]

CODESEG [ім’я]

Початок або продовження сегментного коду

.DATA

DATASEG

Початок або продовження ініціалізованих даних. Також використовується для визначення даних типу near.

.CONST

CONST

Початок або продовження сегмента постійних даних (констант)

.DATA?

UDATASEG

Початок або продовження сегмента неініціалізованих даних. Також використовується для визначення даних типу near.

.STACK [розмір]

STACK [розмір]

Початок або продовження сегмента стека

.FARDATA [ім’я]

FARDATA [ім’я]

Початок або продовження сегмента ініціалізованих даних типа far.

.FARDATA? [ім’я]

UFARDATA? [ім’я]

Початок або продовження сегмента неініціалізованих даних типа far