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
   51   52   53   54   55   56   57   58   59   60