Impressum
< Sprungbefehle Inhalt

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:

MnemonicFunktionBytesMZFlags
ACALL adr11Unterprogrammaufruf innerhalb einer 2 k-Byte-Seite.22-
LCALL adr16Unterprogrammaufruf .32-
RETRücksprung aus einem Unterprogramm.12-
RETIRücksprung aus einer Interrupt-Service-Routine.12-