Übungsblatt 5: Zeigerparameter und rekursive Prozeduren
Themen dieser Übung sind der Zugriff auf den Hauptspeicher aus einer
Prozedur bzw. Funktion heraus mit Hilfe von Zeigerparametern und die Programmierung rekursiver Prozeduren, d. h.
von Prozeduren, die sich selber aufrufen. Wir verwenden hierfür wieder
Jasmin.
Aufgabe 1: Polynomauswertung mit Zeigerparameter
Implementieren Sie zunächst die in der Vorlesung beschriebene Polynomauswertung mit
Zeigerparameter auf dem Stapel. Schreiben Sie also die Parameterwerte in
den Speicher und übergeben Sie die Speicheradresse des ersten Parameters
mittels des Stapels an die Prozedur. Liefern Sie das Ergebnis der
Polynomberechnung in der Speicherstelle mit der kleinsten Adresse zurück.
Prüfen Sie wieder, ob der richtige Wert berechnet wurde.
Aufgabe 2: Summe gerader und ungerader Zahlen mit Prozedur
Schreiben Sie eine Variante des Programms zum Aufsummieren
gerader und ungerader Zahlen aus dem Hauptspeicher bei der:
Die Verarbeitung der Zahlenliste 1, 12, 17, 25, 32, 41, 50 mit einer Prozedur Summe durchgeführt wird.
In dieser Prozedur ein Kontextwechsel erfolgt. Beschreiben Sie zum Testen die Register AX bis DX vor Aufruf der
Prozedur mit Testwerten, die nach Beendigung der Prozedur wiederhergestellt sein müssen.
Übergeben Sie folgende Parameterwerte mit Hilfe des Stapels an Summe:
Die Startadresse der Werte im Speicher (z. B. 100).
Die Anzahl der zu verarbeitenden Zahlenwerte (hier: 7).
Die Adresse der Speicherzelle, in der die Summe der geraden Zahlen gespeichert werden soll (z. B. 114).
Die Adresse der Speicherzelle, in der die Summe der ungeraden Zahlen gespeichert werden soll (z. B. 116).
Aufgabe 3: Summe gerader und ungerader Zahlen mit mehreren Prozeduren
Erweitern Sie Ihre Lösung aus der vorherigen Aufgabe derart, dass die Zahlenwerte zur Berechnung der beiden Summen nun in
der Prozedur Summe durch Aufruf der beiden
parameterlosen (Hilfs-)Prozeduren GSumme und
USumme erfolgt.
Aufgabe 4: Summe aufeinanderfolgender Zahlen mit Rekursion
Implementieren Sie schließlich das in der Vorlesung besprochene Beispiel
zur Berechnung der Summe einer Folge von natürlichen Zahlen 1..n
mittels rekursivem Unterprogrammaufruf. Führen Sie das Programm aus und
studieren Sie die Technik Parameter und interne Variablen eines
Unterprogramms (hier repräsentiert das Register AX eine
derartige interne Variable) auf den Stapel zu retten. Dies wird bei der
Übersetzung einer Hochsprache, wie z. B. C++ oder Java, in Maschinensprache
vom Compiler automatisch erledigt. Das Retten lokaler Variablen, Parameter-
und Registerwerte auf den Stapel verursacht einen zusätzlichen
Verwaltungsaufwand. Dieser kann dazu führen, dass eine rekursive
Problemlösung langsamer ist, als eine iterative.