Unterprogramme

  ACALL und LCALL   RET und RETI
Unterprogramme dienen dazu, die eigenen Programme übersichtlicher zu gestalten, wiederverwendbare Bibliotheken aufzubauen oder oft benutzte Funktionen mit dem selben Code auszuführen. Daher sind Unterprogrammaufrufe ein wichtiger Bestandteil jedes größeren Programms.

ACALL und LCALL

ACALL und LCALL dienen dem selben Zweck: ein Unterprogramm auszurufen und nach der Ausführung des Unterprogrammes an der Stelle im Hauptprogramm weiterzumachen, an der es verlassen wurde. Aus diesem Grunde wird bei jedem Unterprogrammaufruf die Rücksprungadresse automatisch auf dem Stack abgelegt und der Stackpointer (SP) um 2 Stellen erhöht. Daher ist auch immer dafür Sorge zu tragen, dass auf dem Stack genug Platz frei ist. Steht der Stackpointer über 126 und wird in ein Unterprogramm gesprungen, so werden wichtige Register in den SFR überschrieben oder Schreiboperationen auf Adressen durchgeführt, hinter denen kein RAM steht - das Programm stürzt ab oder reagiert sonstwie indeterministisch.

ACALL [Sprungziel]
LCALL [Sprungziel]

Der Unterschied zwischen ACALL und LCALL ist derselbe wie der zwischen AJMP und LJMP - der Unterschied in den Anzahlen der für die Adressangabe vorgesehenen Bits bewirkt eine unterschiedliche Reichweite für die Sprungziele. Aber auch hier wählt der Assembler bei einfacher Angabe von CALL [Sprungziel] automatisch die richtige Variante für den Unterprogrammaufruf.
zurück zum Anfang

RET und RETI

RET und RETI (Return bzw. Return from Interrupt) bewirken einen Rücksprung vom Unterprogramm in das Hauptprogramm. Dabei wird die vorher gespeicherte Rücksprungadresse vom Stack geholt und in den Programmzähler geschrieben.

RET
RETI

RETI unterscheidet sich insofern von RET, als dass es einen Rücksprung aus einer automatisch aufgerufenen Interruptroutine darstellt. Dabei werden zusätzlich die Interrupts wieder freigegeben. Bei einem Interruptaufruf passiert genau das selbe wie bei einem Unterprogrammaufruf - mit einer Ausnahme: zusätzlich werden die Interrupts gesperrt, um mehrfaches Auslösen des Interrupts zu verhindern. Sonst könnte ein Interrupt so oft aufgerufen werden, dass der Stack überläuft und genau die oben beschriebenen negativen Effekte eintreten. Diese Sperre wird bei RETI wieder freigegeben.

	; ... Hauptprogramm ...
		call unterprogramm
	; ... weitere Befehle des Hauptprogramms ...
	
	unterprogramm:
	; ... Befehle des Unterprogramms ...
		call unterprogramm1
		call unterprogramm2
	; ...
		ret

	unterprogramm1:
	; ...
		ret
		
	unterprogramm2:
	; ...
		ret


zurück zum Anfang
Seite zurück Startseite Seite vor
Erik Buchmann
EMail an: Owner@ErikBuchmann.de