<< Előző oldal Vissza a tartalomjegyzékhez Következő oldal >>
11.4.12. Szubrutinhívás
Assembly programozás tartalomjegyzék
A szubrutinok (alprogramok) olyan programrészletek, amelyek a főprogram bármely pontjáról végrehajtathatóak és végrehajtásuk után a főprogram a félbehagyás helyétől folytatódik. Szubrutinként a többször ismétlődő programrészleteket célszerű megvalósítani, amivel a program hossza nagy mértékben csökkenthető.
A PIC mikrovezérlők a szubrutinok felhasználását közvetlenül támogatják. A programmemória tetszőleges helyén elhelyezett szubrutin futása a program tetszőleges helyéről indítható a CALL szubrutinhívó utasítás segítségével. A CALL utasítás hatására a programszámláló értéke a nyolc-szintes hardver verembe kerül, és a programfutás a szubrutinnal folytatódik.
A szubrutin utolsó utasítása hivatott arra, hogy a programfutást visszairányítsa a főprogramra, ezért ez a RETURN vagy RETLW utasítás kell, hogy legyen. Ezek hatására a veremből, az ott elhelyezett visszatérési cím átkerül a programszámlálóba, és a főprogram a szubrutinhívás utáni utasítással folytatódik. A RETLW utasítás a visszatéréskor egy, az utasításban megadott, 8 bites konstanst tölt be a W munkaregiszterbe.
Példaprogram szubrutinhívásra:
... ... call SUB_1 ;szubrutinhívás ... ... ... SUB_1 ... ... return ;visszatérés a szubrutinból a 0. lapra
A CALL szubrutinhívó utasításnál a PC (programszámláló) értéke, a majdani visszatérési cím, a verembe kerül, majd az alsó 11 bit az utasításból, a felső kettő pedig a PCLATH regiszterből töltődik be. A PCLATH értékét előre be kell állítani a szubrutin helyének megfelelően (csak 2k-nál nagyobb programmemória esetén).
A RETURN és RETLW visszatérő utasítások esetén a verem tetejéről a visszatérési cím a PC-be töltődik. A PCLATH regiszter nem kerül felhasználásra.
A szubrutinok egymásbaágyazhatóak, vagyis egy szubrutinból is hívható ugyanaz vagy egy másik szubrutin.
A nyolc-szintes verem nyolcszoros szubrutin egymásbaágyazódást enged meg. Ez azt jelenti, hogy a főprogramtól számítva maximálisan nyolc szubrutinhívás szerepelhet visszatérő utasítás nélkül. Ezen felül már programfutási hiba keletkezik. A verem túlcsordulásáról a közepes teljesítményű PIC mikrovezérlők nem adnak visszajelzést, így a programnak kell megfelelően üzembiztosnak lennie.
Azoknál a mikrovezérlőknél, ahol a programmemória nagyobb, mint 2k x 14 bit, memórialapozási eljárásokra lehet szükség. Ha a CALL szubrutinhívó utasítás egy másik memórialapra irányul, a memórialapot előzőleg szoftveresen ki kell választani. A CALL utasításban 11 bites cím van tárolva, amely csak 2k-s memóriahatárig képes címezni. Ha a mikrovezérlő programmemóriája 4k vagy 8k, a teljes terület címzéséhez szükség van még egy , illetve két címzőbitre. A CALL utasításnál a 13 bites programszámláló alsó 11 bitjét az utasítás adja meg, a felső egy vagy két bitet pedig a PCLATH vezérlő regiszter egyes bitjei a fenti ábrák szerint.
Tehát a lapozás a PCLATH regiszter 3. és 4. bitjének beállításával történik a következő táblázatnak megfelelően.
PCLATH | Elérhető programmemória terület |
Memórialap száma |
|
---|---|---|---|
4. | 3. | ||
0 | 0 | 0000h..07FFh | 0. lap |
0 | 1 | 0800h..0FFFh | 1. lap |
1 | 0 | 1000h..17FFh | 2. lap |
1 | 1 | 1800h..1FFFh | 3. lap |
Szubrutinból való visszatérésnél nincs szükség lapozásra, mivel a veremben a teljes 13 bites visszatérési cím tárolva van.
Azoknál a mikrovezérlőknél, ahol a programmemória 2k vagy kisebb, a PCLATH regiszter 3. és 4. bitje nincs felhasználva. A programkompatibilitási problémák elkerülése miatt célszerű a regisztert csak bit-szintű utasításokkal kezelni. (Például a CLRF PCLATH nullázó utasítások miatt egy nagyobb programmemóriájú mikrovezérlőhöz a program már csak átírással használható.)
Példaprogram szubrutinhívásra a 0. lapról az 1. lapra:
... bsf PCLATH,3 ;az 1. lap beállítása bcf PCLATH,4 ;az 1. lap beállítása (opcionális) call SUB_1 ;szubrutinhívás ... SUB_1 ... ... return ;visszatérés a szubrutinból a 0. lapra
Tudomány és Technika (test@t-es-t.hu)
<< Előző oldal Vissza a tartalomjegyzékhez Vissza a lap tetejére Következő oldal >>