Unterprogramme
Unterprogramme in Assembler sind Codefragmente, welche von einer beliebigen Stelle aus aufgerufen werden können. Ist das Unterprogramm beendet,
so kehrt es zurück an die Stelle im Code zurück, von der es aufgerufen wurde.
Ein Beispiel:
...
call zeit ; Aufruf 1 des Unterprogramms zeit
... ; Hier geht es nach dem 1. Aufruf weiter
...
call zeit ; Aufruf 2 des Unterprogramms zeit
... ; Hier geht es nach dem 2. Aufruf weiter
...
zeit: ; Hier startet das UP zeit
.... ; Abarbeiten
ret ; Rückkehr
Aufruf eines Unterprogramms
Der Aufruf eines Unterprogramms erfolgt über acall adr11
oder lcall adr16
.
Dieser Befehl sichert zuerst den aktuellen Wert des Programm-Counters auf dem Stack und springt dann zum Unterprogramm.
Viele Assembler erlauben statt acall
und lcall
einfach call
zu schreiben und wandeln dieses
call
bei der Assemblierung einfach in ein acall
oder lcall
um.
Rückkehr aus einem Unterprogramms
Ist ein Unterprogramm zu ende kehrt man mit ret
(return) zum Aufrufer zurück. Hierzu wird die Code-Adresse vom Stack geholt, welche
der Aufruf (call) dort abgelegt hat und in den Programm-Counter geschrieben.
Rückkehr aus einer Interrupt-Service-Routine
Ist das Unterprogramm ein Interrupt-Service-Routine (ISR) so reicht ein ret
alleine nicht aus. Man muss hier dem Controller
zusätzlich mitteilen dass die Behandlung der Unterbrechung (Interrupt) fertig ist.
Dies erledigt der Befehl reti
(return from interrupt) welcher (wie ret
) zurück zum Aufrufer springt, allerdings davor
den Zustand der Interruptbehandlung verlässt. Wird eine ISR nicht mit reti
verlassen, so kann der entsprechende Interrupt nicht
mehr ausgelöst werden. Der Controller würde in diesem Fall davon ausgehen, dass der Interrupt weiterhin behandelt wird und da sich Interrupts
der gleichen Priorität nicht gegenseitig unterbrechen würden weitere Interruptanforderungen ignoriert werden.
Hier die Befehle für Unterprogramme in der Übersicht:
Mnemonic | Funktion | Bytes | MZ | Flags |
ACALL adr11 | Unterprogrammaufruf innerhalb einer 2 k-Byte-Seite. | 2 | 2 | - |
LCALL adr16 | Unterprogrammaufruf . | 3 | 2 | - |
RET | Rücksprung aus einem Unterprogramm. | 1 | 2 | - |
RETI | Rücksprung aus einer Interrupt-Service-Routine. | 1 | 2 | - |