<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Unterprogramm</id>
	<title>Unterprogramm - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Unterprogramm"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Unterprogramm&amp;action=history"/>
	<updated>2026-05-20T13:52:33Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Unterprogramm&amp;diff=66923&amp;oldid=prev</id>
		<title>185.109.110.126: /* Parameter/Argumente */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Unterprogramm&amp;diff=66923&amp;oldid=prev"/>
		<updated>2024-05-08T10:12:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Parameter/Argumente&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Datei:Unterprogramm Prinzip.png|mini|Grundprinzip eines Unterprogramms]]&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Unterprogramm&amp;#039;&amp;#039;&amp;#039; ist ein Teil eines [[Computerprogramm]]s, das eine bestimmte Funktionalität bereitstellt. Es kann von anderen Programmen/Programmteilen &amp;#039;&amp;#039;aufgerufen&amp;#039;&amp;#039; werden, um eine Aufgabe zu übernehmen und verzweigt danach wieder an die aufrufende Stelle &amp;#039;&amp;#039;zurück&amp;#039;&amp;#039;. Ein Unterprogramm wird i.&amp;amp;nbsp;d.&amp;amp;nbsp;R. durch einen Bezeichner (z.&amp;amp;nbsp;B. einen Namen) identifiziert, und ihm können zur Verarbeitung Daten als Argumente übergeben werden.&amp;lt;ref name=&amp;quot;FU BER&amp;quot;&amp;gt;[http://www.inf.fu-berlin.de/lehre/SS04/ALP2/vorlesung/1.4.pdf FU Berlin &amp;#039;&amp;#039;Unterprogramme&amp;#039;&amp;#039;]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bezüglich der [[Terminologie]] kennt man aus der Praxis einen großen Reichtum an Varianten, die teilweise synonym, teilweise mit semantischen Unterschieden angewendet werden.&amp;lt;ref name=&amp;quot;FU BER&amp;quot; /&amp;gt; Bezeichnungen wie &amp;#039;&amp;#039;[[Prozedur (Programmierung)|Prozedur]] ({{lang|en|procedure}}), [[Funktion (Programmierung)|Funktion]] ({{lang|en|function}}), [[Routine (Programmierung)|Routine oder Subroutine]], Operation, {{lang|en|Section}}, [[Modul (Software)|Modul]]&amp;#039;&amp;#039; sind teils historisch und oft im Umfeld verschiedener [[Programmiersprache]]n entstanden, entsprechen aber im Wesentlichen der Bedeutung ‚Unterprogramm‘ oder werden &amp;lt;!--als Sammelbegriff--&amp;gt;so genannt. So sind im Kontext der [[Objektorientierte Programmierung|objektorientierten Programmierung]] &amp;#039;&amp;#039;[[Methode (Programmierung)|Methoden]] (methods)&amp;#039;&amp;#039; – je nach Programmiersprache – einer [[Klasse (Programmierung)|Klasse]], einem [[Objekt (Programmierung)|Objekt]] oder einer [[Generische Funktion|generischen Funktion]] als in sich abgeschlossene Einheiten zugeordnet.&lt;br /&gt;
&lt;br /&gt;
Bezüglich der Erstellung, Wartung und [[Computerprogramm#Übersetzung und Ausführung|Ausführung]] können Unterprogramme je nach Art der Implementierung eigenständige Komponenten sein (‚Unterprogramme‘ im engeren Sinn, die oft vorübersetzt in [[Programmbibliothek]]en zusammengefasst sind) oder, zusammen mit anderen Funktionsteilen, den [[Programmcode]] eines bestimmten Programms bilden.&lt;br /&gt;
&lt;br /&gt;
== Zweck von Unterprogrammen ==&lt;br /&gt;
Das Kapseln von Programmteilen in Unterprogrammen entspringt dem [[Programmierparadigma|Paradigma]] der [[Prozedurale Programmierung|prozeduralen Programmierung]]. Die beiden wichtigsten Vorteile, die dadurch beim [[Softwaredesign]] erzielt werden, sind die Wiederverwendbarkeit von Programmteilen und die Verbesserung der [[Softwarequalität#Beispiel ISO/IEC 9126|Verständlichkeit]] und [[Wartbarkeit]] des [[Quelltext]]s.&lt;br /&gt;
&lt;br /&gt;
Unterprogramme für bestimmte technische oder betriebliche Funktionen (z.&amp;amp;nbsp;B. eine [[Prüfziffer]]nberechnung) als unternehmensweiter Standard sind ein Aspekt der [[Softwarearchitektur]].&lt;br /&gt;
&lt;br /&gt;
Eine Weiterführung des Konzepts der Unterprogramme sind die [[modulare Programmierung]] und [[Modul (Software)|Software-Module]].&lt;br /&gt;
&lt;br /&gt;
== Terminologie ==&lt;br /&gt;
; [[Funktion (Programmierung)|Funktion]]&lt;br /&gt;
: In Programmiersprachen wie C, C++, C#, Java oder Python werden alle Unterprogramme grundsätzlich &amp;#039;&amp;#039;Funktion&amp;#039;&amp;#039; genannt. In Sprachen wie [[Pascal (Programmiersprache)|Pascal]] oder [[BASIC]] werden nur diejenigen Unterprogramme als Funktion bezeichnet, die einen Wert an den Aufrufer zurückliefern.&lt;br /&gt;
; [[Prozedur (Programmierung)|Prozedur]]&lt;br /&gt;
: Oft wird unter Prozedur eine spezielle Funktion verstanden, die keinen Rückgabewert liefert (z.&amp;amp;nbsp;B. in Pascal oder BASIC). [[Fortran|FORTRAN77]] fasst unter {{lang|en|&amp;#039;&amp;#039;procedures&amp;#039;&amp;#039;}} alle Funktionen und prozedurale Unterprogramme &amp;#039;&amp;#039;(subroutines)&amp;#039;&amp;#039; zusammen.&amp;lt;ref&amp;gt;{{Internetquelle |url=http://www.fortran.com/F77_std/rjcnf0001-sh-15.html#sh-15 |titel=FORTRAN77-Standard, Kap. 15 |sprache=en |abruf=2010-09-20 |archiv-url=https://web.archive.org/web/20100124143401/http://www.fortran.com/F77_std/rjcnf0001-sh-15.html#sh-15 |archiv-datum=2010-01-24 |offline=ja |archiv-bot=2023-02-03 03:35:20 InternetArchiveBot }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
: Abweichend davon werden in [[COBOL]] als Prozeduren lediglich die in der ‚Procedure Division‘ formulierten, durch ‚Paragraphs‘ (Abschnitte) benennbaren Anweisungen (Befehle) bezeichnet, unabhängig davon, ob sie als [[Unterroutine]] verwendet werden oder nicht. Auch in [[PL/I]] bezeichnet man die im Befehlsteil des Quelltextes enthaltenen – prozedural (= ‚fortschreitend‘) zu verarbeitenden – Anweisungen als „Prozeduren“.&lt;br /&gt;
; [[Methode (Programmierung)|Methode]]&lt;br /&gt;
: Unter einer Methode versteht man in objektorientierten Programmiersprachen Unterprogramme von bzw. in Klassen.&lt;br /&gt;
&lt;br /&gt;
== Geschichte ==&lt;br /&gt;
[[David Wheeler]], [[Maurice V. Wilkes]] und [[Stanley Gill]] gelten als Entwickler der ersten Subroutine (damals auch &amp;#039;&amp;#039;{{lang|en|Wheeler-jump}}&amp;#039;&amp;#039; genannt).&amp;lt;ref&amp;gt;{{Internetquelle |url=http://www.computer.org/portal/web/awards/cp-wheeler |titel=David Wheeler. 1985 Computer Pioneer Award |werk=www.computer.org |hrsg=IEEE |abruf=2013-10-20 |archiv-url=https://web.archive.org/web/20131020192219/http://www.computer.org/portal/web/awards/cp-wheeler |archiv-datum=2013-10-20 |offline=ja |archiv-bot=2023-02-03 03:35:20 InternetArchiveBot }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Internetquelle |url=http://www.computerhistory.org/fellowawards/hall/bios/David,Wheeler/ |titel=David Wheeler. 2003 Fellow |werk=computerhistory.org |hrsg=Computer History Museum |offline=1 |archiv-url=https://web.archive.org/web/20150403185912/http://www.computerhistory.org/fellowawards/hall/bios/David,Wheeler/ |archiv-datum=2015-04-03 |abruf=2013-10-20}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Literatur |Autor=David J. Wheeler |Titel=The use of sub-routines in programmes |Sammelwerk=Proceedings of the 1952 ACM national meeting (Pittsburgh) |Verlag=ACM |Ort=New York |Datum=1952 |Seiten=235–236 |DOI=10.1145/609784.609816}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Literatur |Autor=Maurice V. Wilkes, David J. Wheeler, Stanley Gill |Titel=Preparation of Programs for an Electronic Digital Computer, with special reference to the EDSAC and the use of a library of subroutines |Auflage=1. |Verlag=Addison-Wesley |Ort=Cambridge (Massachusetts) |Datum=1951 |Seiten=22 |OCLC=1189900}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In frühen [[Imperative Programmierung|imperativen Programmiersprachen]] (zum Beispiel frühe [[BASIC]]- und [[Fortran|FORTRAN]]-Varianten) gab es nur das Konzept des parameterlosen Unterprogramms, welches über [[Sprunganweisung]]en aufgerufen wurde und ausschließlich über globale Variablen mit dem Hauptprogramm wechselwirken konnte.&lt;br /&gt;
&lt;br /&gt;
Mit dem Aufkommen der [[Strukturierte Programmierung|strukturierten Programmierung]] entwickelte sich das Konzept der Prozedur mit Aufrufparametern, die zunächst überwiegend als [[Referenzparameter]] übergeben wurden &amp;#039;&amp;#039;(call by reference)&amp;#039;&amp;#039;, das heißt eine Änderung des Parameters innerhalb der Prozedur ändert den zugehörigen Parameter an der Aufrufstelle der Prozedur. Die Einführung von expliziten Rückgabewerten von Prozeduren (respektive Funktionen) ermöglichte die Berechnung von Resultaten, ohne die Referenzparameter zu verändern.&lt;br /&gt;
&lt;br /&gt;
In einem weiteren Schritt wurden [[Wertparameter]] zur Übergabe an Prozeduren eingeführt &amp;#039;&amp;#039;(call by value)&amp;#039;&amp;#039;, um unerwünschte Rückwirkungen auf das Hauptprogramm weiter zu reduzieren.&lt;br /&gt;
&lt;br /&gt;
Zur Vermeidung von [[Programmfehler]]n wurde in einigen Programmiersprachen wie zum Beispiel [[Pascal (Programmiersprache)|Pascal]] eine [[starke Typisierung]] von Parametern eingeführt: die tatsächlich verwendeten Parameter müssen hierbei relativ streng [[Zuweisungskompatibilität|zuweisungskompatibel]] mit den formal deklarierten Parametern sein.&lt;br /&gt;
&lt;br /&gt;
In manchen Programmiersprachen, wie beispielsweise [[Modula-2]], können Prozedurvariablen aufgerufen oder als Parameter eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Schließlich wurden Prozeduren als objektbezogene &amp;#039;&amp;#039;Methoden&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;Zugriffsfunktionen&amp;#039;&amp;#039; Bestandteil des [[Objektorientierte Programmierung|objektorientierten Paradigmas]], etwa in den Programmiersprachen [[Java (Programmiersprache)|Java]] und [[C++]].&lt;br /&gt;
&lt;br /&gt;
== Unterschiedliche Implementierungen ==&lt;br /&gt;
Unterprogramme können, abhängig von der verwendeten [[Integrierte Entwicklungsumgebung|Entwicklungsumgebung]] oder [[Programmiersprache]], unterschiedlich implementiert sein:&lt;br /&gt;
* Als logisch in sich geschlossener &amp;#039;&amp;#039;Teil im [[Quelltext]] eines Programms.&amp;#039;&amp;#039; Hinsichtlich der administrativen Verwaltung (z.&amp;amp;nbsp;B. bei Änderungen), der [[Compiler|Kompilierung]] und der technischen Ausführung auf einem Computer gehören solche Quelltextabschnitte fest zum Gesamtprogramm. Je nach Programmiersprache und Art der [[Implementierung]] hat die Subroutine Zugriff auf alle, nur bestimmte oder nur ihre eigenen Daten und Funktionen.&lt;br /&gt;
: Eine Variante davon ist das Verwenden von Programmcodeteilen, die als eigenständige, in [[Programmbibliothek]]en verwaltete Quelltext-Elemente geführt werden: Diese werden im Quelltext der sie benutzenden Programme durch spezielle Anweisungen (z.&amp;amp;nbsp;B. [[Include]]) in dem zur Kompilierung (temporär) bereitgestellten Quellcode eingefügt. Solche Codeteile aus Quelltextbibliotheken werden (z.&amp;amp;nbsp;B. in den Programmiersprachen [[COBOL]] oder [[RPG (Programmiersprache)|RPG]]) auch ‚Copybook‘ genannt.&lt;br /&gt;
* Als administrativ und zur Ausführung &amp;#039;&amp;#039;eigenständige Programme.&amp;#039;&amp;#039; Sie werden erst zur Ausführungszeit „dynamisch“ geladen. Zum Teil, zum Beispiel bei [[Dynamic Link Library|DLL&amp;#039;s]], können solche [[Lademodul|‚nachgeladenen Module‘]] mehrere und unterschiedliche Unterprogramme enthalten. Details siehe [[Dynamisches Linken]].&lt;br /&gt;
* Eine &amp;#039;&amp;#039;Mischform&amp;#039;&amp;#039; aus beidem sind Unterprogramme mit ebenfalls eigenständigem Quelltext und getrennter [[Kompilierung]]. Ihr [[Maschinencode]] wird jedoch zusammen mit dem Code sie aufrufender Programme zu einer [[Ausführbare Datei|ausführbaren Datei]] „statisch gebunden“. Details siehe [[Statisches Linken]].&lt;br /&gt;
&lt;br /&gt;
Innerhalb dieser Grundvarianten stellen bestimmte Programmiersprachen weitere Funktionsdetails bereit, die beim Binden und Laden von Unterprogrammen anwendbar sind. Siehe dazu die Beispiele zu &amp;#039;&amp;#039;[[Linker (Computerprogramm)#Überladen|Überladen]]&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;[[Linker (Computerprogramm)#Überschreiben|Überschreiben]]&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Eine besondere Kategorie von Unterprogrammen bilden die in einem Computersystem bereitgestellten &amp;#039;&amp;#039;[[Systemaufruf|Systemfunktionen]]&amp;#039;&amp;#039; (wie Lesen, Schreiben, Clock usw.). Sie werden im engeren Sinn nicht als Unterprogramm bezeichnet, jedoch nach demselben Ablaufprinzip benutzt: Aufruf mittels [[Anweisung (Programmierung)|Anweisung]], meist mit Parameter-/Argumentenübergabe, Ausführung der Subfunktion zum Beispiel im [[Betriebssystem]], anschließend Rückkehr ins rufende Programm mit Fortsetzung der Verarbeitung.&lt;br /&gt;
&amp;lt;!--Prinzipiell ist jedes Programm ein Unterprogramm – nämlich des Betriebssysstems. Ich denke, das sollte aber hier nicht offen erscheinen, es würde die OMA verwirren--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Die Beispiele in den Programmiersprachen C, C++ und Java zeigen Details zur Programmierung mit Unterprogrammen.&lt;br /&gt;
&lt;br /&gt;
=== C, C++ oder Java ===&lt;br /&gt;
Das folgende Beispiel ist ein in Unterprogramm in [[C (Programmiersprache)|C]], [[C++]] oder [[Java (Programmiersprache)|Java]], das beim Aufruf einen Wert entgegennimmt und ihn mit einem konstanten Wert multipliziert, es soll die Umrechnung von Zoll in Zentimeter demonstrieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float inch2cm(float length) {&lt;br /&gt;
    return 2.54 * length;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
Das folgende Beispiel in [[Python (Programmiersprache)|Python]] gibt die in &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; übergebene Zeichenkette auf dem Bildschirm aus, liefert aber keinen Wert zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def hello(message):&lt;br /&gt;
    print(message)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
Ein einfaches Hallo-Welt-Programm in [[Assemblersprache]], die vier Zeilen ab der Marke &amp;lt;code&amp;gt;print&amp;lt;/code&amp;gt; stellen das Unterprogramm dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; highlight=&amp;quot;10-14&amp;quot;&amp;gt;&lt;br /&gt;
segment code&lt;br /&gt;
&lt;br /&gt;
..start:&lt;br /&gt;
    mov ax, data&lt;br /&gt;
    mov ds, ax&lt;br /&gt;
    call print ; Aufruf des Unterprogramms&lt;br /&gt;
    mov ah, 4Ch&lt;br /&gt;
    int 21h ; Beenden des Programms&lt;br /&gt;
&lt;br /&gt;
print:&lt;br /&gt;
    mov dx, hello&lt;br /&gt;
    mov ah, 09h&lt;br /&gt;
    int 21h&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
segment data&lt;br /&gt;
    hello: db &amp;#039;Hello World!&amp;#039;, 13, 10, &amp;#039;$&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Objektmodule Großrechner IBM-Welt ===&lt;br /&gt;
* Aufrufende Programme setzen einen Call-Befehl ab und übergeben dabei (mit ‚USING x, y …‘) eine Liste mit den Adressen der Datenfelder/Datenstrukturen, die das Unterprogramm benötigt oder zurückgeben soll. Im [[Maschinencode]] des Programms wird dabei vom [[Compiler]] das Register 1 mit der Adresse der Adressliste und das Register 14 mit der Rücksprungadresse, Register 15 mit der Einsprungadresse im Unterprogramm geladen, danach wird (über ‚BR 15‘) dorthin verzweigt.&lt;br /&gt;
* Aufgerufene Programme übernehmen die übergebenen Adressen zur Adressierung ihrer strukturidentischen Datendeklarationen (deren Bezeichner jedoch anders gewählt werden können), wodurch diese &amp;#039;fremden’ Daten mit den Befehlen des Unterprogramms ansprechbar sind.&lt;br /&gt;
* Nach der Verarbeitung im Unterprogramm erfolgt der Rücksprung über das Register 14.&lt;br /&gt;
&lt;br /&gt;
Wie und mit welchen Aufrufkonventionen aufrufende und aufgerufene Module zusammenwirken, zeigt das nachfolgende Beispiel. Unterstellt sei ein fiktives Hauptprogramm, das ein Unterprogramm mit Namen UPRO aufruft. Siehe auch nebenstehende Grafik:&lt;br /&gt;
[[Datei:Call-Schnittstelle IBM.png|mini|Struktur der Call-Schnittstelle]]&lt;br /&gt;
* Quellcode des rufenden Programms (im Beispiel COBOL-ähnlicher Code):&lt;br /&gt;
 * Daten:&lt;br /&gt;
   A.&lt;br /&gt;
    &amp;gt;Struktur von A, z.&amp;amp;nbsp;B.:&lt;br /&gt;
    Ax &amp;gt;Format und Längen&lt;br /&gt;
    Ay ...&lt;br /&gt;
   B.&lt;br /&gt;
    B1 (Definitionen, ggf. weitere Teilfelder)&lt;br /&gt;
    B2 (Definitionen)&lt;br /&gt;
    B3 (Definitionen)&lt;br /&gt;
 * Funktionscode:&lt;br /&gt;
    A-ROUTINE.&lt;br /&gt;
    A-1. &amp;gt;Befehle-1&lt;br /&gt;
         Call UPRO Using A, B2.&lt;br /&gt;
    A-2. &amp;gt;Befehle-2, z.&amp;amp;nbsp;B. Auswerten und Verarbeiten Rückgabewert(e)&lt;br /&gt;
    A-ROUTINE Exit.&lt;br /&gt;
     &amp;gt;beliebige weitere Routinen/Befehle&lt;br /&gt;
 * Programm-Ende&lt;br /&gt;
&lt;br /&gt;
* Quellcode des Unterprogramms, ggf. aus einer anderen Programmiersprache:&lt;br /&gt;
: Der daraus erzeugte Objectcode ist im Lademodul des Hauptprogramms eingebunden.&lt;br /&gt;
 * Datendefinitionen:&lt;br /&gt;
    A-DAT &amp;gt;Format und Sub-Struktur wie in A; andere Bezeichner möglich!&lt;br /&gt;
    B-2  dto.&lt;br /&gt;
    C-x  z.&amp;amp;nbsp;B. eigene Definitionen von UPRO&lt;br /&gt;
 * Funktionscode:&lt;br /&gt;
    Entry UPRO Using A-DAT, B-2.&lt;br /&gt;
          &amp;gt;Feldbezeichnungen von Using ggf. abweichend, Reihenfolge identisch zu &amp;#039;Call&amp;#039;!&lt;br /&gt;
    &amp;gt;Weitere Befehle des Unterprogramms:&lt;br /&gt;
    &amp;gt;Mit vollem Zugriff (auch ändernd) auf die Struktur (Einzelfelder) von A-Daten und B2.&lt;br /&gt;
     Ggf. setzen Returncode, z.&amp;amp;nbsp;B. in B-2 (= B2)&lt;br /&gt;
    Exit = UPRO-Ende&lt;br /&gt;
&lt;br /&gt;
* Ablauf des Unterprogramm-Aufrufs (Call und [[Return Code|Return]]):&lt;br /&gt;
: (vom Compiler generierter Code, bei [[Assemblersprache|Assemblerprogrammen]] vom Programmierer codiert)&lt;br /&gt;
 * Call im rufenden Programm:&lt;br /&gt;
    Setzt in einer (vom Compiler angelegten) Hauptspeicher-Adressliste&lt;br /&gt;
     mit 2 Einträgen die Adresse von A und von B-2&lt;br /&gt;
    Setzt einen Zeiger ([[Register (Computer)|Register]], konkret R1) auf die Adressliste&lt;br /&gt;
    Setzt einen Zeiger (Register 14) auf die Rückkehradresse A-2.&lt;br /&gt;
    Setzt einen Zeiger (Register 13) auf die Register-Savearea,&lt;br /&gt;
     (Speicherbereich automatisch vom Compiler reserviert, Details siehe&amp;lt;ref&amp;gt;[http://publib.boulder.ibm.com/infocenter/zvm/v5r4/index.jsp?topic=/com.ibm.zvm.v54.gcta0/dup0008.htm IBM SAVE]&amp;lt;/ref&amp;gt;)&lt;br /&gt;
    Lädt Register 15 mit der Adresse (Entrypoint) des Unterprogramms&lt;br /&gt;
     (die z.&amp;amp;nbsp;B. vom [[Linker (Computerprogramm)|Linkage Editor]] im Maschinenprogramm eingesetzt wurde)&lt;br /&gt;
    Verzweigt über R15 in das Unterprogramm&lt;br /&gt;
 * Entry im Unterprogramm:&lt;br /&gt;
    &amp;gt;Sichern der Registerstände in die Savearea des rufenden Programms (lt. R13)&lt;br /&gt;
     Speichern der Adresse dieser Savearea (= Inhalt R13) in einem eigenen Speicherbereich&lt;br /&gt;
    &amp;gt;Übernehmen der übergebenen Variablen (aus Adressliste lt. R1):&lt;br /&gt;
     Adr(A-DAT) = aus Adressliste(1. Adresse), Adr(B-2) = aus Adressliste(2. Adresse)&lt;br /&gt;
    &amp;gt;Verarbeitung – mit Zugriff auf übergebene und eigene Daten sowie individueller Registernutzung&lt;br /&gt;
 * Rücksprung ins rufende Programm:&lt;br /&gt;
    &amp;gt;Laden R13 mit der gespeicherten Adresse der Savearea&lt;br /&gt;
     Rückladen aller Register aus der Savearea lt. R13&lt;br /&gt;
    &amp;gt;Exit: Verzweigung (= Rückkehr) zu Adresse A-2 im rufenden Programm (lt. Inhalt R14)&lt;br /&gt;
&lt;br /&gt;
Nach demselben Schema (Registerkonventionen, Savearea) könnte das Modul weitere Untermodule aufrufen. Das dazu erforderliche Sichern der Registerstände zum Zeitpunkt des Aufrufs erfolgt jeweils in einer „Savearea“ genannten Speicherstruktur aufrufender Module, die folgenden Aufbau aufweist:&amp;lt;br /&amp;gt;&lt;br /&gt;
  |_A_|_B_|_C_|_D1_|_D2_|_.._|_D15_|   = 18 „Fullwords“ (je 4 Bytes) = 72 Bytes&amp;lt;small&amp;gt;&lt;br /&gt;
    A = nicht belegt, reserviert&lt;br /&gt;
    B = Adresse der Savearea des aufrufenden Moduls; vom aufgerufenen Modul in seiner eigenen Savearea gesetzt&lt;br /&gt;
    C = Adresse der Savearea des aufgerufenen Moduls; vom aufgerufenen Modul in der Savearea des aufrufenden Moduls gesetzt&lt;br /&gt;
    Dn = Inhalt der Register „14 bis 12“ (entspricht R14,R15,R0,R1 .. R12):&lt;br /&gt;
        vom aufgerufenen Modul in der Savearea des aufrufenden Moduls gespeichert und vor dem Rücksprung zurückgeladen.&amp;lt;/small&amp;gt;&lt;br /&gt;
Über die Inhalte von Speicherstelle B und C sind die Saveareas der beteiligten Module in ihrer Aufrufreihenfolge miteinander &amp;#039;&amp;#039;verkettet;&amp;#039;&amp;#039; sie zeigen den Stand des jeweils letzten Modulaufrufs, womit sich z.&amp;amp;nbsp;B. im [[Debugger|Debug-Modus]] bei [[Modultest]]s die Aufruftiefe und die -Reihenfolge ermitteln und nachvollziehen lässt. Einen detaillierten Assembler-Programmcode für die Savearea-Behandlung zeigt [[Liste von Hallo-Welt-Programmen/Assembler#IBM-Mainframe-ASSEMBLER|dieses Beispiel]].&lt;br /&gt;
&lt;br /&gt;
== Parameter/Argumente ==&lt;br /&gt;
{{Hauptartikel|Parameter (Informatik)}}&lt;br /&gt;
Unterprogramme (UP) führen [[Funktion (Objekt)|Funktionen]] aus, die in der Regel Daten benötigen, die zu den sie aufrufenden Programmen gehören. Aus Sicht des Unterprogramms können diese Daten Eingangs- oder Ergebniswerte sein. Da je nach angewendeter Unterprogrammtechnik ein Unterprogramm grundsätzlich nur ‚Zugriff‘ auf seine eigenen Daten hat, enthalten die Programmiertechniken und -Sprachen Mechanismen, mit denen die ‚fremden‘ Daten für das Unterprogramm verfügbar gemacht werden; nur dann können dessen Befehle die für sie ‚externen‘ Daten ansprechen. Je nach UP-Variante/Programmiersprache können diesbezüglich verschiedene Konstellationen unterschieden werden:&lt;br /&gt;
* Das Unterprogramm kann auf alle im Hauptprogramm definierten Daten zugreifen. Meist ist das nur bei Unterroutinen der Fall, die zum Quellcode des Hauptprogramms gehören.&lt;br /&gt;
* Das Unterprogramm kann auf Daten(bereiche) zugreifen, die als ‚global‘ deklariert wurden.&lt;br /&gt;
* Der Unterroutine werden &amp;#039;ihre&amp;#039; Daten beim Aufruf explizit ‚mitgeteilt‘. Die Angaben dazu sind sogenannte „Parameter“.&lt;br /&gt;
&lt;br /&gt;
Die Parametertechnik wird vor allem bei unabhängig vom aufrufenden Programm entwickelten Unterprogrammen verwendet, um einem aufzurufenden UP mitzuteilen, welche Daten es verwenden/verarbeiten soll. Diese Parameter bilden die gemeinsame [[Schnittstelle]] zwischen aufrufendem und aufzurufendem UP. Ein Beispiel ist „DispoSaldoPrüfen (Kontonummer, Betrag, Antwort)“. Im Unter- und im Hauptprogramm sind diese Angaben nach einheitlich angewendeten Konventionen strukturell identisch zu deklarieren. Die während der Programmausführung beim einzelnen Aufruf tatsächlich übergebenen Werte werden &amp;#039;Argumente&amp;#039; genannt, z.&amp;amp;nbsp;B. als Kontonummer der Wert &amp;#039;4711&amp;#039; und als Betrag &amp;#039;-500,00&amp;#039;, als Antwort könnte alternativ &amp;#039;OK&amp;#039; oder &amp;#039;Überziehung&amp;#039; zurückgeliefert werden. Dieses Begriffspaar (&amp;#039;&amp;#039;Parameter&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Argument&amp;#039;&amp;#039;) wird synonym auch als &amp;#039;&amp;#039;formale&amp;#039;&amp;#039; und &amp;#039;&amp;#039;tatsächliche Parameter&amp;#039;&amp;#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Parameter/Argumente können &amp;#039;&amp;#039;elementare&amp;#039;&amp;#039; [[Datenfeld]]er beliebigen Formats sein, z.&amp;amp;nbsp;B. Text oder Integer – oder auf beiden Seiten der Schnittstelle einheitlich definierte [[Datenstruktur]]en. Bezüglich der Verwendbarkeit der übergebenen Daten kann unterschieden werden, ob diese &amp;#039;&amp;#039;nur gelesen&amp;#039;&amp;#039; oder auch &amp;#039;&amp;#039;verändert&amp;#039;&amp;#039; werden können, zum Beispiel für Ergebniswerte. Weiterhin lässt sich unterscheiden, ob mit den Parametern &amp;#039;&amp;#039;Adressen&amp;#039;&amp;#039; (im Hauptspeicher) oder die &amp;#039;&amp;#039;tatsächlichen Daten&amp;#039;&amp;#039; übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Technisch (z.&amp;amp;nbsp;B. im Maschinencode) erfolgt die Übergabe der Parameter/Argumente je nach verwendeter Programmiersprache und Rechnertechnologie mithilfe unterschiedlicher Hardware-Einrichtungen. So kann z.&amp;amp;nbsp;B. der [[Stapelspeicher|Stack]] die Argumente aufnehmen oder Parameter werden über [[Register (Computer)|Register]] übergeben.&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Normdaten|TYP=s|GND=4253859-2}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprachelement]]&lt;br /&gt;
[[Kategorie:Unterprogramm| ]]&lt;/div&gt;</summary>
		<author><name>185.109.110.126</name></author>
	</entry>
</feed>