Page 56 - 6733
P. 56
Сегмент стеку є обов’язковим, якщо в програмі застосовуються підпрограми
або переривання. Його оголошення виглядатиме таким чином:
STACK SEGMENT IDATA ; оголошуємо сегмент стеку
RSEG STACK ; відкриваємо сегмент стеку
DS 20 ; резервуємо у ньому 20 байт
Програма, написана для мікроконтролера, повинна виконувати якісь дії
постійно, поки включене живлення пристрою. Тому основна програма
обов’язково вміщує так званий "вічний цикл", в якому постійно виконуються
команди, що забезпечують алгоритм функціонування пристрою:
loop_label: ; мітка початку циклу
[ команди ]
JMP loop_label ; перехід на початок циклу
Основна програма, як правило, починається з коду ініціалізації регістрів
спеціального призначення для задання режимів роботи різних пристроїв (таймери,
блок послідовного інтерфейсу та ін.), ініціалізації глобальних змінних та інших
дій, що слід виконати один раз на початку. Зокрема, якщо в програмі
застосовуються підпрограми або переривання, слід ініціалізувати спеціальний
регістр – покажчик стеку командою
MOV SP, #STACK-1
Тут STACK – ім’я, яке ми вказали при оголошенні сегменту стеку.
Таким чином, наведену вище програму можна переписати так:
CSEG AT 0
LJMP start ; перехід до основної програми
STACK SEGMENT IDATA ; оголошуємо сегмент стеку
RSEG STACK ; відкриваємо сегмент стеку
DS 20 ; резервуємо у ньому 20 байт
codeseg SEGMENT CODE ; ; оголошуємо сегмент коду codeseg
RSEG codeseg ; відкриваємо сегмент коду codeseg
start: ; початок основної програми
MOV SP, #STACK-1 ; ініціалізація покажчика стеку
loop_label: ; початок вічного циклу
;... ; команди вічного циклу
JMP loop_label ; перехід на початок циклу
END
56