Використання сегментів в мові програмування асемблер

Необхідно відзначити, що навіть коли ми не замислюємося про сегментах, в програмі є два сегменти: сегмент коду програми і сегмент даних. Якщо уважно придивитися до програми, то можна виявити, що крім кодів команд в пам'яті програм зберігаються константи, тобто в пам'яті програм мікроконтролера розташовуються, по крайней мере, два сегменти: програма і дані. Чергування програми і констант може привести до небажаних наслідків. Внаслідок будь-яких причин дані можуть бути випадково виконані в якості програми або навпаки програма може бути сприйнята і оброблена як дані.

Малюнок 1. Розбиття пам'яті програм і пам'яті даних на сегменти.

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

Абсолютні сегменти пам'яті

Для визначення абсолютних сегментів пам'яті використовуються директиви:

Малюнок 3. Приклад використання директиви CSEG для розміщення підпрограми обслуговування переривання.

Переміщувані сегменти пам'яті

Директива segment дозволяє визначити ім'я сегмента і область пам'яті, де буде розміщуватися даний сегмент пам'яті. Для кожної області пам'яті визначено ключове слово:

У цьому прикладі оголошена рядок buferKlav, що складається з восьми байтових змінних. Крім того, в даному прикладі оголошена змінна VershSteka, відповідна останній комірці пам'яті, використовуваної для зберігання змінних. Мінлива VershSteka може бути використана для початкової ініціалізації покажчика стека для того, щоб відвести під стек максимально доступну кількість осередків внутрішньої пам'яті. Це необхідно для того, щоб уникнути переповнення стека при вкладеному виклику підпрограм.

Приклад використання переміщуються сегментів в початковому тексті програми наведено на малюнку 8.

Малюнок 8. Приклад використання директив segment і rseg в програмному модулі

У цьому прикладі наведено початковий ділянку основної програми мікроконтролера, на який проводиться перехід з нульовою осередки пам'яті програм. Використання такої структури програми дозволяє в будь-який момент часу при необхідності використовувати будь-який з векторів переривання, доступний в конкретному микроконтроллере, для якого пишеться ця програма. Досить розмістити визначення цього вектора з використанням директиви cseg.

У наведеному прикладі використано ім'я переміщуваного сегмента _code. Воно було оголошено в самій першому рядку вихідного тексту програми. Конкретне ім'я переміщуваного сегмента може бути будь-яким, але як вже говорилося раніше воно повинно відображати ту задачу, яку вирішує даний конкретний модуль.

Разом зі статтею "Використання сегментів в мові програмування асемблер" Новомосковскют: