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.
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.
|
||||||
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.
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 |