Сегментна структура програм
;Приклад 1-1. Проста програма з трьома сегментами ;Вкажемо відповідність сегментних регістрів сегментам assume CS:code,DS:data ;Опишемо сегмент команд code segment ;Відкриємо сегмент команд begin: mov AX,data ;Налаштуємо DS mov DS,AX ;на сегмент даних; Виведемо на екран рядок тексту mov АН,09h ;Функція DOS виведення на екран mov DX,offset msg ;Адреса рядка int 21h ;Виклик DOS ;Завершимо програму mov AX,4C00h ;Функція DOS завершення програми int 21h ;Виклик DOS code ends ;Закриємо сегмент команд ;Опишемо сегмент даних data segment ;Відкриємо сегмент даних msg db "Програма працює !$' ;Виводиться рядок data ends ;Закриємо сегмент даних ;Опишемо сегмент стека stk segment stack ;Відкриємо сегмент стека db 256 dup (?) ;Відводимо під стек 256 байт stk ends ;Закриємо сегмент стека end begin ;Кінець тексту з точкою входу
mov AX,data ;Налаштуємо DS mov DS,AX ;на сегмент даних
Ключ /z дозволяє виведення на екран рядків вихідного тексту програми, в яких асемблер виявив помилки (без цього ключа пошук помилок довелося б проводити по лістингу трансляції). Ключ /zi керує включенням в об'єктний файл інформації, яка не потрібна при виконанні програми, але використовується відладчиком. Ключ /n пригнічує виведення в лістинг переліку символічних позначень у програмі, від чого дещо зменшується інформативність лістингу, але скорочується його розмір. Наступні параметри визначають імена файлів: вихідного (P.ASM), об'єктного (P.OBJ) і лістингу (P.LST). При бажанні можна в рядку виклику транслятора вказати повні імена файлів з їх розширеннями, проте потреби в цьому немає, оскільки транслятор використовує саме вказані вище розширення. Рядок виклику компонувальника маєнаступний вид:
Ключ /х пригнічує утворення лістингу компонування, який зазвичай не потрібний. Ключ /v передає в завантажувальний файл інформацію, що використовується відладчиком. Параметри, що стоять далі, позначають імена модулів: об'єктного (Р.ОЫ) і завантажувального (Р.ЕХЕ). Оскільки при вивченні цієї книги вам доведеться написати та налагодити велику кількість програм, доцільно створити командний файл (з ім'ям, наприклад, А.ВАТ), що автоматизує виконання однотипних операцій трансляції та компонування. Текст командного файлу в найпростішому варіанті може бути таким (припущення, що шлях до каталогу з пакетом TASM був вказаний у параметрі команди PATH):
tasm /z/zi/n p,p,p tlink /х/v р,р
Запуск підготовленої програми Р.ЄХЕ здійснюється командою .р.ехе або просто При завантаженні програми сегменти розміщуються у пам'яті, як показано на рис. 1.9.

Мал. 1.9. Образ програми у пам'яті.
Стек

Мал. 1.10. Організація стека: а - вихідний стан, б - після завантаження одного елемента (в даному прикладі - вмісту регістру АХ), - після завантаження другого елемента (вмісту регістру DS), г - після вивантаження одного елемента, д - після вивантаження двох елементів та повернення у вихідний стан.
переведе стек у стан, показаний на рис. 1.10 ст. У стеку тепер зберігатимуться два елементи, причому доступним буде тільки верхній, на який вказує покажчик стека SP. Якщо через деякий час нам знадобилося відновити вихідний вміст збережених у стеку регістрів, ми повинні виконати команди вивантаження зі стеку pop (виштовхнути):
Стан стека після виконання першої команди показано на рис. 1.10 г, а після другої - на рис. 1.10, буд. Для правильного відновленнявмісту регістрів вивантаження зі стека має виконуватися в порядку, суворо протилежному завантаженню - спочатку вивантажується елемент, завантажений останнім, потім попередній елемент і т.д. Зовсім не обов'язково при відновленні даних поміщати їх туди, де вони були перед збереженням. Наприклад, можна помістити в стек вміст DS, а витягти його звідти в інший сегментний регістр - ES;
push DS pop ES; Тепер ES = DS, а стек порожній