Unterprogramme (Assembler)

Einführung

Oftmals hat man beim Programmieren bestimmte Quelltext-Abschnitte, die mehrmals vorkommen. Damit sich der Quelltext möglichst übersichtlich hält, verwendet man Unterprogrammen um Quelltext-Abschnitte zusammenzufassen.

Was passiert, wenn ein Unterprogramm aufgerufen wird?

Sobald ein Unterprogramm aufgerufen wird, wird zuerst einmal die Rücksprungadresse auf dem Stack abgelegt und der Programm-Counter (PC) mit der Adresse des Unterprogramms geladen. Anschließend werden die Befehle innerhalb des Unterprogramms, also das Unterprogramm selbst, ausgeführt. Zum Schluss wird die Rücksprungadresse wieder vom Stack geholt und der Programm-Counter (PC) mit dieser Adresse geladen.

 

Anwendung

Stackpointer setzen

Dem Stackpointer wird die Adresse 0x80 zugewiesen, um möglichen Problemen vorzubeugen:

mov SP,#0x80

Unterprogramm erstellen

Die Anwendung ist recht simpel. Man muss lediglich eine Sprungmarke setzen und das Ganze mit einem ret beenden.

unterprogramm:
   //Quellcode
   ret

Der Aufruf eines Unterprogramms erfolgt über call.

call unterprogramm

Wichtig ist, dass sich der Stack nach dem Laden des Unterprogramms und vor der Ausführung des Befehls ret im selben Zustand befindet, damit die korrekte Rücksprungadresse geladen werden kann.

 

Zusammenfassung

Man benötigt eine „Sprungmarke“ und den Befehl ret um ein Unterprogramm zu bilden. Aufrufen kann man es mithilfe von call.

 

Quelltext-Beispiel

Das folgende (kommentierte) Quelltext-Beispiel ruft das Unterprogramm „hello“ auf:

$NOMOD51                 //Vordefinitionen vergessen
#include <at89c5131.h>   //Neue Definitionen einbinden

cseg at 0x0000

call hello               //Unterprogramm "hello" aufrufen

hello:                   //Sprungmarke "hello"
   mov a,#1              //Wert 1 in Akkumulator schieben
   ret                   //Befehl signalisiert Unterprogramm beendet

end