108 I 1. Programy, podprogramy, segmenty
cym podprogram. Podprogramy te zostały umieszczone powyżej programu głównego. Na samym końcu został umieszczony podprogram obsługi przerwania od licznika TO. Program główny jest zakończony rozkazem skoku do procedury wyświetlania na polu odczytowym zapytania o kolejny pomiar.
108 I 1. Programy, podprogramy, segmenty
r
RETI
podprogram obsługi przerwania PPTO:
RET
podprogram
KLAW:
RET
podprogram WYS LCD:
LJMP POMIAR LCALLWYS LCD
LCALL KLAW
LCALL WYS LCD POMIAR:
LCALL INIT-LCD
sygnał przerwania
JROG_GL:
HOBh LJMP PP TO
Oh
LJMP PRÓG GL
Start programu
Rys. 11-2 Wywoływanie podprogramów.
Jeżeli w trakcie wykonywania programu zostanie przyjęty sygnał przerwania, to zgodnie z wcześniej omówionymi zasadami, procesor przejdzie do obsługi tego przerwania wywołując odpowiedni podprogram rozkazem LjMF PPTO.
Wywoływanie podprogramów może następować z dowolnego miejsca - z podprogramów obsługi przerwań jak i z innych podprogramów. Umieszczenie podprogramów względem programu głównego może być dowolne. 1
Rozkazy skoków, wywołania i powrotów z podprogramów są przedstawione w poniższych tabelach:
Tabela 11-1. Rozkazy skoków
instrukcje: |
zapis binarny instrukcji |
wykonywane operacje |
AJMP adr_ll |
AldAyAg00010 A7 + A0 |
PC <- PC + 2, PC<- ADR_11 |
LJMP adr_16 |
00000010 Ais Ag A7-A0 |
PC <- PC + 3, PC <- adr_16 |
SJMP rei |
10000000 rei |
PC <- PC + 2, PC <- PC + rei |
JMP @A + DPTR |
01110011 |
PC <- PC + 2, PC <- A + DPTR |
Instrukcje skoków bezwarunkowych powodują wpisanie do licznika rozkazów PC adresu następnego wykonywanego programu. Adres może być podany w sposób bezpośredni, ale uniemożliwia to przesuwanie programów, lub w postaci etykiety, co jest najczęściej stosowane. Rozkaz ACALL operuje tylko adresem 11-bitowym. Umożliwia to wykonywanie skoków w obszarze 2 KB bloku pamięci programu. Rozkaz LCALL daje możliwość wykonywania skoków w całym 64 KB obszarze pamięci programu. Rozkaz SJMP traktuje wartość rei jako 8 bitową liczbę ze znakiem o zakresie -128 ^ +127. W miejsce wartości rei można także wstawić etykietę, a asembler sam wyliczy odpowiednią wartość. W większości asemblerów wystarczy podać tylko rozkaz JMP, a asembler sam dobierze odpowiedni rozkaz do długości skoku. W rozkazie JMP @A+DPTR do rejestru PC jest wpisywana suma zawartości akumulatora i rejestru DPTR, przy czym liczba w akumulatorze jest traktowana jako liczba całkowita bez znaku, tzn. o zakresie 0 + 255.
Tabela 11-2. Rozkazy wywołania podprogramów.
instrukcje: |
zapis binarny instrukcji |
wykonywane operacje |
ACALL adrii |
AllAAi00001 Ay -r A0 |
PO-PC + 2, SP<~SP+1 (SP)<-PC70, SP*-SP+1 (SP)<-PCj5 g, PC10 0<-adr_l 1 |
LCALL adr_16 |
00010010 A1!; + A8 A7-Ao |
PC<—PC+3, SP<-SP+1 (SPJ^PC**, SP<-SP+1 (SP)<-PC15 „ PC<-adr_16 |
Rozkazy wywołania podprogramów powodują schowanie na stos adresu, °d którego będzie wykonywany program po powrocie z podprogramu, a do licznika jest wpisywany adres, od którego zaczyna się podprogram. Zakresy