Директива assume

За допомогою директиви ASSUME асемблеру повідомляється інформація про відповідність між сегментними регістрами, і програмними сегментами. Директива має такий вигляд:

ASSUME <пара>[[, <пара>]]

де <пара> - це <сегментный регистр> :<имя сегмента>

або <сегментный регистр> : NOTHING

ASSUME ES: A, DS: B, CS: C

Таким чином, директива ASSUME дає право не вка-зувати в командах (по крайней мере, в більшості з них) префікси - опущені префікси буде самостійно відновлювати асемблер.

Якщо в директиві ASSUME вказано кілька пар з одним і тим же сегментним регістром, то остання з них «скасовує» попередні, т. К. Кожному сегментному регістру, можна поставити у відповідність тільки один сегмент. У той же час на один і той же сегмент можуть вказувати різні сегментні регістри. Якщо в директиві ASSUME в якості другого елементу пари задано службове слово NOTHING (нічого), наприклад, ASSUME ES: NOTHING, то це означає, що з даного моменту сегментний регістр не вказує ні на який сегмент, що асемблер не повинен використовувати цей регістр при трансляції команд.

Завантаження проводиться таким чином. Нехай регістр DS необхідно встановити на початок сегмента В. Для завантаження регістра необхідно виконати присвоювання виду DS: = B. Однак зробити це командою MOV DS, B не можна, оскільки ім'я сегмента - це константний вираз, т. Е. Безпосередній операнд, а по команді MOV заборонена пересилання безпосереднього операнда в сегментний регістр (див. Нижче). Тому таку пересилку слід робити через інший, несегментний регістр, наприклад, через АХ:

Аналогічним чином завантажується і регістр ES.

Регістру CS завантажувати немає необхідності, так як до початку виконання програми цей регістр вже буде вказувати, на початок сегмента коду. Таку завантаження виконує операційна система, перш ніж передає управ-ня програмою.

Завантажити регістр SS можна двояко. По-перше, його можна завантажити в самій програмі так само, як DS або ES. По-друге, таке завантаження можна доручити операційній системі. Для цього в директиві SEGMENT, що відкриває опис сегмента стека, треба вказати спеціальний параметр STACK, наприклад:

S SEGMENT STACK

В такому випадку завантаження S в регістр SS буде виконана автоматично до початку виконання програми.