Konvention anrufen
Im Informatik, a Konvention anrufen ist ein Implementierungsebene (niedriges) Schema für wie Unterroutinen erhalten Parameter von ihrem Anrufer und wie sie ein Ergebnis zurückgeben. Unterschiede in verschiedenen Implementierungen umfassen die Parameter, wo Parameter, Rückgabewerte, Rückkehr Adressen und Bereichslinks werden platziert (Register, Stapel oder Erinnerung usw.), und wie die Aufgaben der Vorbereitung auf einen Funktionsaufruf und die Wiederherstellung der Umgebung danach zwischen dem Anrufer und dem Callee aufgeteilt werden.
Das Aufrufen von Konventionen kann mit einer bestimmten Programmiersprache zusammenhängen Bewertungsstrategie, aber meisten Compiler.
Variationen
Das Aufrufen von Konventionen kann sich in:
- Wo Parameter, Rückgabeteile und Rückgabeberechnung platziert werden (in Register, auf der Rufen Sie Stack an, eine Mischung aus beiden oder in anderen Gedächtnisstrukturen)
- Für die im Speicher übergebenen Parameter wird die Reihenfolge, in der tatsächliche Argumente für formale Parameter übergeben werden (oder die Teile eines großen oder komplexen Arguments).
- Wie ein (möglicherweise langer oder komplexer) Rückgabewert vom Callee zurück an den Anrufer geliefert wird (auf dem Stapel, in einem Register oder im Haufen)
- Wie die Aufgabe des Einrichtens und Reinigens nach einem Funktionsaufruf zwischen dem Anrufer und dem Callee aufgeteilt wird
- Ob und wie Metadaten Die Beschreibung der Argumente wird bestanden
- Wenn der vorherige Wert des Frame -Zeigers gespeichert wird, mit dem der Rahmenzeiger wiederhergestellt wird, wenn die Routine endet (im Stapelrahmen oder in einem Register)
- Wenn statische Umfangsverbindungen für den nicht lokalen Datenzugriff der Routine geleitet werden (normalerweise an einer oder mehreren Positionen im Stapelrahmen, aber manchmal in einem allgemeinen Register oder für einige Architekturen in Spezialregistern)
- Wie lokale Variablen zugewiesen werden, kann manchmal auch Teil der Anrufkonvention sein (wenn der Anrufer für die Callee zuteilt)
In einigen Fällen umfassen Unterschiede auch die folgenden:
- Konventionen, für die Register direkt von der Callee verwendet werden können, ohne erhalten zu werden
- Welche Register werden als flüchtig angesehen und müssen, wenn es flüchtig ist, von der Callee nicht wiederhergestellt werden
Viele Architekturen haben nur eine weit verbreitete Anrufkonvention, die oft vom Architekt vorgeschlagen wird. Zum Riscs einschließlich sparc, mips und Risc-vEs werden häufig Registernamen verwendet, die auf dieser Anrufkonvention basieren. Zum Beispiel registriert MIPS $4
durch $7
habe "Abi -Namen" $a0
durch $a3
, widerspiegelt ihre Verwendung für Parameter, die in der Standardanrufkonvention bestehen. (RISC-CPUs haben viele gleichwertige allgemeine Register, so dass es in der Regel keinen Hardware-Grund gibt, ihnen andere Namen als Zahlen zu geben.)
Obwohl etwas[die?] Programmiersprachen kann teilweise die Aufrufsequenz in der Sprachspezifikation oder in einer zentralen Implementierung unterschiedliche Implementierungen solcher Sprachen angeben (d. H. Unterschiedlich unterschiedlich Compiler) kann weiterhin verschiedene Anrufkonventionen verwenden, und eine Implementierung kann eine Auswahl von mehr als einer Anrufkonvention bieten. Gründe dafür sind Leistung, häufige Anpassung an die Konventionen anderer populärer Sprachen, mit oder ohne technische Gründe sowie Beschränkungen oder Konventionen, die von verschiedenen auferlegt wurden. "Computerplattformen".
Architekturen
x86 (32-Bit)
Das x86 Architektur wird mit vielen verschiedenen Anrufkonventionen verwendet. Aufgrund der geringen Anzahl von Architekturregistern und der historischen Fokus auf Einfachheit und kleiner Codegröße gibt viele X86-Konventionen Argumente auf dem Stapel. Der Rückgabewert (oder ein Zeiger darauf) wird in einem Register zurückgegeben. Einige Konventionen verwenden Register für die ersten Parameter, die die Leistung verbessern können, insbesondere für kurze und einfache Blattroutinen, die sehr häufig aufgerufen werden (d. H. Routinen, die keine anderen Routinen bezeichnen).
Beispielanruf:
drücken Eax ; Übergeben Sie ein Registerergebnis drücken DWORD [Ebp+20] ; Übergeben Sie eine Gedächtnisvariable (Fasm/TASM -Syntax) drücken 3 ; Übergeben Sie einige Konstante Anruf berechnen ; Das zurückgegebene Ergebnis ist jetzt in EAX
Typische Callee -Struktur: (Einige oder alle (außer Ret) der folgenden Anweisungen können in einfachen Verfahren optimiert werden). Einige Konventionen lassen den Parameterraum zugeteilt, indem sie einfach sind ret
Anstatt von ret imm16
. In diesem Fall könnte der Anrufer add esp,12
In diesem Beispiel oder anderweitig mit der Änderung zu ESP.
calc: drücken Ebp ; Speichern Sie den alten Rahmenzeiger MOV Ebp,Esp ; Holen Sie sich einen neuen Rahmenzeiger Sub Esp,Einheimischer ; Reserve -Stapelraum für Einheimische . . ; Berechnungen durchführen, Ergebnis in EAX lassen . MOV Esp,Ebp ; freier Platz für Einheimische Pop Ebp ; Stellen Sie den alten Rahmenzeiger wieder her ret Paramse ; freier Parameterraum und Rückgabe.
Arm (A32)
Der Standard 32-Bit ARM Calling Convention trifft die 15 allgemeinen Register als:
- R15: Programmzähler (gemäß der Anweisungssatzspezifikation).
- R14: Linkregister. Die BL -Anweisung, die in einem Unterroutine -Anruf verwendet wird, speichert die Absenderadresse in diesem Register.
- R13: Stapelzeiger. Die Push/Pop -Anweisungen im Betriebsmodus "Daumen" verwenden nur dieses Register.
- R12: Intra-Procedure-Call-Schurkenregister.
- R4 bis R11: Lokale Variablen.
- R0 bis R3: Argumentwerte, die an eine Unterroutine übergeben wurden, und die Ergebnisse, die von einem Unterprogramm zurückgegeben wurden.
Wenn der zurückgegebene Wert zu groß ist, um in R0 bis R3 zu passen oder deren Größe zum Kompilierungszeit nicht statisch festgelegt werden kann, muss der Anrufer zum Laufzeit Platz für diesen Wert bereitstellen und einen Zeiger in R0 an diesen Speicherplatz weitergeben.
Unterroutinen müssen den Inhalt von R4 bis R11 und den Stapelzeiger bewahren (möglicherweise, indem sie sie auf dem Stapel in der Stapel speichern Funktionsprologund dann sie als Kratzerraum benutzen und dann aus dem Stapel im Stapel restaurieren Funktions Epilog). Insbesondere Unterprogramme, die andere Unterprogramme aufrufen muss Speichern Sie die Absenderadresse im Linkregister R14 im Stapel, bevor Sie diese anderen Unterprogramme aufrufen. Solche Unterprogramme müssen diesen Wert jedoch nicht auf R14 zurückgeben - sie müssen diesen Wert lediglich in R15, den Programmzähler, laden, um zurückzukehren.
Der Arm Calling Convention Mandate mit einem vollständigen Stapel.[1]
Diese Anrufkonvention bewirkt eine "typische" Arm -Unterroutine für:
- Schieben Sie im Prolog R4 auf R11 in den Stapel und schieben Sie die Absenderadresse in R14 in den Stapel (dies kann mit einer einzelnen STM -Anweisung erfolgen).
- Kopieren Sie alle bestandenen Argumente (in R0 bis R3) in die örtlichen Kratzerregister (R4 bis R11);
- Zuordnen andere lokale Variablen den verbleibenden lokalen Kratzerregistern (R4 bis R11);
- Berechnungen durchführen und andere Unterprogramme nach Bedarf unter Verwendung von BL unter der Annahme, dass R0 bis R3, R12 und R14 nicht erhalten bleibt, nicht erhalten bleiben.
- Setzen Sie das Ergebnis in R0 ein;
- Ziehen Sie im Epilog R4 bis R11 aus dem Stapel und ziehen Sie die Rückgabeadresse an den Programmzähler R15. Dies kann mit einer einzelnen LDM -Anweisung erfolgen.
Arm (A64)
Der 64-Bit-Arm (Aarch64) Calling Convention trifft die 31 allgemeinen Register als:[2]
- x31 (SP): Stapelzeiger oder ein Nullregister, abhängig vom Kontext.
- X30 (LR): Verfahrensverbindungsregister, verwendet zur Rückkehr von Unterprogrammen.
- X29 (FP): Rahmenzeiger.
- x19 bis x29: Callee-Saved.
- x18 (PR): Plattformregister. Wird für einige operativ-systemspezifische Sonderzwecke oder ein zusätzliches Anruferregister verwendet.
- X16 (IP0) und X17 (IP1): Intra-Procedure-Call-Kratzerregister.
- x9 bis x15: Lokale Variablen, Anrufer gespeichert.
- x8 (XR): Indirekte Rückgabewertadresse.
- x0 bis x7: Argumentwerte übergeben und die Ergebnisse, die von einer Unterroutine zurückgegeben wurden.
Alle Register beginnen mit x haben ein entsprechendes 32-Bit-Register, das vorangestellt ist w. Somit wird ein 32-Bit X0 W0 genannt.
In ähnlicher Weise werden die 32 Floating-Punkt-Register als:[3]
- V0 bis V7: Argumentwerte übergeben und die Ergebnisse, die von einer Unterroutine zurückgegeben wurden.
- V8 bis V15: Callee-Saved, aber nur die unteren 64 Bit müssen erhalten werden.
- V16 bis V31: Lokale Variablen, Anrufer gespeichert.
Powerpc und Power ISA
Das Powerpc und Macht ISA Architekturen haben eine große Anzahl von Registern, sodass die meisten Funktionen alle Argumente in Registern für verabschieden können Einzelstufe Anrufe. Zusätzliche Argumente werden auf den Stapel weitergegeben, und der Platz für registrierungsbasierte Argumente wird im Stapel immer als Komfort für die genannte Funktion zugewiesen, falls Multi-Level-Anrufe verwendet werden (rekursiv oder auf andere Weise), und die Register müssen gespeichert werden. Dies ist auch in Nutzen in Variadische Funktionen, wie zum Beispiel printf()
, wo die Argumente der Funktion als Array zugegriffen werden müssen. Für alle prozeduralen Sprachen wird eine einzelne Anrufkonvention verwendet.
MIPS
Der O32[4] Abi ist das Am häufigsten verwendete Abi aufgrund seines Status als Original System v ABI für MIPS.[5] Es ist streng stackbasiert, mit nur vier Registern $a0-$a3
verfügbar, um Argumente zu bestehen. Diese wahrgenommene Langsamkeit zusammen mit einem antiken Gleitkomma-Modell mit nur 16 Registern hat die Verbreitung vieler anderer Anrufkonventionen gefördert. Der ABI nahm 1990 Gestalt an und wurde seit 1994 nie aktualisiert. Es ist nur für 32-Bit-MIPs definiert, aber aber GCC hat eine 64-Bit-Variation namens O64 erstellt.[6]
Für 64-Bit der N64 ABI (nicht verwandt mit Nintendo 64) durch Siliziumgrafiken wird am häufigsten verwendet. Die wichtigste Verbesserung ist, dass jetzt acht Register für die Verabschiedung von Argumenten verfügbar sind. Es erhöht auch die Anzahl der Floating-Punkt-Register auf 32. Es gibt auch eine ILP32-Version namens N32, die 32-Bit-Zeiger für kleinere Code verwendet, analog zu den x32 Abi. Beide laufen im 64-Bit-Modus der CPU.[6]
Es wurden einige Versuche unternommen, O32 durch einen 32-Bit-ABI zu ersetzen, der N32 mehr ähnelt. Eine Konferenz von 1995 erbrachte MIPS EABI, für die die 32-Bit-Version ziemlich ähnlich war.[7] EABI inspirierte MIPS -Technologien, ein radikaleres "Nubi" -Ani vorzuschlagen, das zusätzlich Argument -Register für den Rückgabewert wiederverwendet.[8] MIPS EABI wird von GCC unterstützt, aber nicht von LLVM; Weder unterstützt Nubi.
Für alle O32 und N32/N64 wird die Absenderadresse in a gespeichert $ra
registrieren. Dies wird automatisch mit der Verwendung des JAL
(Sprung und Link) oder JALR
(Sprung- und Linkregister) Anweisungen. Der Stapel wächst nach unten.
Sparc
Das Sparc Architektur, im Gegensatz zu den meisten RISC Architekturen sind aufgebaut Registrieren Sie Windows. In jedem Registerfenster gibt es 24 zugängliche Register: 8 sind die "in" Register (%i0-%i7), 8 sind die "lokalen" Register (%L0-%L7) und 8 sind die "Out" -Enregister (% O0-%O7). Die "in" Register werden verwendet, um Argumente an die aufgerufene Funktion zu übergeben, und alle zusätzlichen Argumente müssen auf die gedrückt werden Stapel. Der Platz wird jedoch immer von der aufgerufenen Funktion zugeordnet, um einen potenziellen Registerfensterüberlauf, lokale Variablen und (auf 32-Bit-SPARC) zu verarbeiten, die eine Struktur nach Wert zurückgeben. Um eine Funktion aufzurufen, platziert man die Argumente, dass die Funktion in den Registern "Out" aufgerufen werden soll. Wenn die Funktion aufgerufen wird, werden die Register "Out" zu den "in" Registern, und die aufgerufene Funktion greift auf die Argumente in ihren "in" Registern zu. Wenn die aufgerufene Funktion abgeschlossen ist, wird der Rückgabewert in "Register" im ersten "Register" angegeben, das zum ersten "Out" -Register wird, wenn die aufgerufene Funktion zurückgibt.
Das System v Abi,[9] was modernste Unix-Age Systeme folgen die ersten sechs Argumente in "in" Registers %i0 bis %i5 und reservieren %i6 für den Rahmenzeiger und %i7 für die Renditeadresse.
IBM System/360 und Nachfolger
Das IBM System/360 ist eine andere Architektur ohne Hardware -Stapel. Die folgenden Beispiele veranschaulichen die aufrufende Übereinkommen OS/360 und Nachfolger Vor der Einführung von 64-Bit Z/Architektur; Andere Betriebssysteme für System/360 haben möglicherweise unterschiedliche Anrufkonventionen.
Rufprogramm:
La 1, Args Lastargumentliste Adresse L 15, = A (Sub) Last -Unterroutine -Adresse BALR 14,15 Zweig in die genannte Routine1 ... args dc a (erste) Adresse des 1. Arguments DC A (zweiter) ... DC A (dritter)+x'80000000 'Letzter Argument2
Programm genannt:
Sub Equ * Dies ist der Einstiegspunkt des Subprogramms
Standardeingangssequenz:
Verwenden von *, 153 STM 14,12,12 (13) sparen Register4 ST 13, Save+4 Saveaaa adr la 12, Save Chain Saveareas St 12,8 (13) LR 13,12 ...
Standard -Rücklaufsequenz:
L 13, sparen+45 LM 14,12,12 (13) L 15, Retval6 BR 14 kehren Sie zum Anrufer zurück, um DS 18F Savearea zu retten7
Anmerkungen:
- Das
BALR
Der Befehl speichert die Adresse der nächsten Anweisung (Rückgabeadresse) im Register, das durch das erste Argument - Register 14 - an die zweite Argumentadresse in Register 15 angegeben wurde. - Der Anrufer übergibt die Adresse einer Liste von Argumentadressen in Register 1. Die letzte Adresse hat das Bit hohe Ordnung eingestellt, um das Ende der Liste anzugeben. Dies begrenzt Programme mit dieser Konvention auf 31-Bit Adressierung.
- Die Adresse der aufgerufenen Routine ist in Register 15. Normalerweise wird dies in ein anderes Register geladen und Register 15 wird nicht als Basisregister verwendet.
- Das
STM
Die Anweisung spart Register 14, 15 und 0 bis 12 in einem von dem Anrufer genannten Caller A in einem 72-Byte-Gebiet Bereich sparen hingewiesen auf Register 13. Die aufgerufene Routine bietet einen eigenen Save -Bereich für die Verwendung durch Unterprogramme, die sie aufruft. Die Adresse dieses Gebiets wird normalerweise in der gesamten Routine in Register 13 aufbewahrt. Die Anweisungen folgenSTM
Aktualisieren Sie die Vorwärts- und Rückwärtsketten, die diesen Speicherbereich mit dem Speicherbereich des Anrufers verknüpfen. - Die Rücklaufsequenz stellt die Register des Anrufers wieder her.
- Register 15 wird normalerweise verwendet, um einen Rückgabewert zu übergeben.
- Das Erklären einer Saveara statisch in der angerufenen Routine macht es nicht ins Leben gerufen und nicht rekursiv; Ein Wiedereintrittsprogramm verwendet eine dynamische Saveara, die entweder aus dem Betriebssystem erworben und bei der Rückkehr oder im Speicher befreit wurde, oder im aufgerichteten Programm.
In dem System/390 Abi[10] und die Z/Architektur Abi,[11] verwendet unter Linux:
- Register 0 und 1 sind volatil
- Die Register 2 und 3 werden für Parameterübergabe- und Rückgabeteile verwendet
- Die Register 4 und 5 werden auch für das Passieren von Parametern verwendet
- Register 6 wird für das Passieren von Parametern verwendet und muss von der Callee gespeichert und wiederhergestellt werden
- Die Register 7 bis 13 sind für die Callee verwendet und müssen von ihnen gerettet und wiederhergestellt werden
- Register 14 wird für die Absenderadresse verwendet
- Register 15 wird als Stapelzeiger verwendet
- Floating-Punkte-Register 0 und 2 werden für Parameterüberschreitungs- und Rückgabeteile verwendet
- Schwimmpunktregister 4 und 6 sind für die Callee verwendet und müssen von ihnen gerettet und wiederhergestellt werden
- In Z/Architektur sind Floating-Punkt-Register 1, 3, 5 und 7 bis 15 für die Verwendung durch die Callee verwendet
- Zugriffsregister 0 ist für die Systemeinsatz reserviert
- Zugriffsregister 1 bis 15 sind für die Callee verwendet
Zusätzliche Argumente werden auf den Stapel weitergegeben.
Superh
Registrieren | Windows CE 5.0 | GCC | Renesas |
---|---|---|---|
R0 | Rückgabewerte. Temporär für die Erweiterung der Pseudoinstruktionen der Montage. Implizite Quelle/Ziel für 8/16-Bit-Operationen. Nicht erhalten. | Rückgabewert, Anrufer spart | Variablen/vorübergehend. Nicht garantiert |
R1..r3 | Dient als temporäre Register. Nicht erhalten. | Anrufer speicherte Kratzer. Strukturadresse (Anrufer speichern standardmäßig) | Variablen/vorübergehend. Nicht garantiert |
R4..r7 | Erste vier Wörter von ganzzahligen Argumenten. Der Argument -Build -Bereich bietet Platz, in den R4 bis R7 Argumente hält. Nicht erhalten. | Parameterübergang, Anrufer spart | Argumente. Nicht garantiert. |
R8..r13 | Dient als ständige Register. Konserviert. | Callee rettet | Variablen/vorübergehend. Garantiert. |
R14 | Standardrahmenzeiger. (R8-R13 kann auch als Rahmenzeiger dienen und Blattroutinen können R1-R3 als Rahmenzeiger verwenden.) Konserviert. | Rahmenzeiger, FP, Callee rettet | Variablen/vorübergehend. Garantiert. |
R15 | Dient als Stackzeiger oder als dauerhaftes Register. Konserviert. | Stackzeiger, SP, Callee rettet | Stapelzeiger. Garantiert. |
Hinweis: "erhaltene" Reserven für Callee Saving; Gleiches gilt für "garantiert".
68k
Die häufigste Anrufkonvention für die Motorola 68000 Serie ist:[12][13][14][15]
- D0, D1, A0 und A1 sind Kratzerregister
- Alle anderen Register sind Callee-Saved
- A6 ist der Rahmenzeiger, der durch eine Compiler -Option deaktiviert werden kann
- Parameter werden von rechts nach links auf den Stapel gedrückt
- Der Rückgabewert wird in D0 gespeichert
IBM 1130
Das IBM 1130 war eine kleine 16-Bit-wortadressible Maschine. Es hatte nur sechs Register plus Bedingungsindikatoren und keinen Stapel. Die Register sind Anweisungsadressenregister (IAR), Akkumulator (ACC), Akkumulatorerweiterung (Durchwahl)und drei Indexregister X1 - X3. Das Anrufprogramm ist für das Speichern von ACC, Durchwahl, X1 und X2 verantwortlich.[16] Es gibt zwei Pseudo-Operationen zum Aufrufen von Unterprogrammen, CALL
Um nicht relokatbare Unterprogramme zu codieren, die direkt mit dem Hauptprogramm verknüpft sind, und LIBF
Um verlängerbare Bibliotheksunterroutinen über a aufzurufen Übertragungsvektor.[17] Beide Pseudo-Ops lösen sich auf a Branche und Lagern IAR (BSI
) Maschinenanweisung, die die Adresse der nächsten Anweisung unter der effektiven Adresse (EA) und Verzweigungen auf EA+1 speichert.
Argumente folgen dem BSI
-Üblicherweise sind dies ein Wort Adressen von Argumenten- Die genannte Routine muss wissen, wie viele Argumente zu erwarten sind, damit sie sie bei der Rückkehr überspringen können. Alternativ können Argumente in Registern verabschiedet werden. Funktionroutinen gab das Ergebnis in ACC für reale Argumente oder in einem Speicherort zurück, der als das bezeichnet wird Reelle Zahl Pseudo-Akumulator (FAC). Argumente und die Absenderadresse wurden unter Verwendung eines Offsets an den IAR -Wert angesprochen, der am ersten Ort der Unterroutine gespeichert wurde.
* 1133 Adresse LDX I 1 Sublast X1 mit der Adresse des ersten Arguments (z. B.) ... * Return Sequence LD Res Last Integer -Ergebnis in ACC * Wenn keine Argumente angegeben wurden, indirekter Zweig zur gespeicherten Rückgabeadresse b I Sub, wenn keine Argumente wurden End Sub zur Verfügung gestellt
Unterroutinen in IBM 1130, CDC 6600 und PDP-8 (Alle drei Computer wurden 1965 eingeführt) Speichern Sie die Absenderadresse an der ersten Stelle einer Unterroutine.[18]
Überlegungen zur Implementierung
Diese Variabilität muss bei der Kombination von Modulen in mehreren Sprachen oder beim Aufrufen von Betriebssystem oder Bibliothek berücksichtigt werden Apis aus einer anderen Sprache als der, in der sie geschrieben werden; In diesen Fällen muss besondere Sorgfalt darauf getroffen werden, die von Caller und Callee verwendeten Anrufkonventionen zu koordinieren. Sogar ein Programm, das eine einzelne Programmiersprache verwendet, kann mehrere vom Compiler ausgewählte Aufrufkonventionen für die Codeoptimierung oder vom Programmierer angegeben.
Thread -Code
Threaded Code platziert die Verantwortung für die Einrichtung und Reinigung nach einem Funktionsaufruf auf den aufgerufenen Code. Der aufrufende Code listet nur die zugerufenen Unterprogramme auf. Dies bringt alle Funktionen und Reinigungscode an einem Ort-dem Prolog und dem Epilog der Funktion-als an den vielen Orten, an denen die Funktion aufgerufen wird. Dies macht den Thread -Code zum kompaktesten Aufrufkonvent.
Der Thread -Code übergibt alle Argumente am Stapel. Alle Rückgabewerte werden auf dem Stapel zurückgegeben. Dies macht naive Implementierungen langsamer als das Aufrufen von Konventionen, die mehr Werte in Registern halten. Threaded -Code -Implementierungen, die mehrere der Top -Stapelwerte in Registern zwischenspeichern, sind jedoch insbesondere die Rückgabeadresse - in der Regel schneller als Unterprogramme, die Konventionen aufrufen, die immer die Rückgabedresse an den Stapel geben.[19][20][21]
Pl/i
Die Standardanrufkonvention für Programme, die in der geschrieben wurden Pl/i Die Sprache verfolgt alle Argumente durch Bezugnahme, obwohl andere Konventionen optional angegeben werden können. Die Argumente werden für verschiedene Compiler und Plattformen unterschiedlich behandelt, aber in der Regel werden die Argumentadressen über eine Argumentliste im Speicher übergeben. Eine endgültige, versteckte Adresse kann an einen Bereich hingewiesen werden, um den Rückgabewert zu enthalten. Aufgrund der Vielzahl von Datentypen, die von PL/I A unterstützt werden Datendeskriptor kann auch übergeben werden, um beispielsweise die Längen des Charakters oder der Bitstrings, der Dimension und der Grenzen von Arrays zu definieren (Arrays ()Dope -Vektoren) oder das Layout und der Inhalt von a Datenstruktur. Dummy -Argumente werden für Argumente erstellt, die Konstanten sind oder nicht mit der Art des Arguments übereinstimmen, das das aufgerufene Verfahren erwartet.
Siehe auch
Verweise
- ^ "Verfahrensnotstandard für die ARM -Architektur". 2021.
- ^ "Parameter im Allgemeinen Register". Arm Cortex-A Series Programmer's Guide für ARMV8-A. Abgerufen 12. November 2020.
- ^ "Parameter in Neon- und Floating-Punkt-Registern". Entwickler.arm.com. Abgerufen 13. November 2020.
- ^ "MIPS32 Anweisungssatz Schnellreferenz".
- ^ Sweetman, Dominic. Siehe MIPS Run (2 ed.). Morgan Kaufmann Publishers. ISBN 0-12088-421-6.
- ^ a b "MIPS Abi Geschichte".
- ^ Christopher, Eric (11. Juni 2003). "MIPS EABI -Dokumentation". [email protected] (Mailingliste). Abgerufen 19. Juni 2020.
- ^ "Nubi".
- ^ System V Application Binärschnittstellen Sparc -Prozessor Supplement (3 ed.).
- ^ "S/390 ELF Application Binary Interface Supplement".
- ^ "ZSERIES ELF ANWENDUNG Binärer Schnittstelle" Ergänzung ".
- ^ Smith, Dr. Mike. "Sharc (21K) und 68K Registervergleich".
- ^ XGCC: Das GNU C/C ++ - Sprachsystem für die eingebettete Entwicklung (PDF). Embedded Support Tools Corporation. 2000. p. 59.
- ^ "Coldfire/68K: Threadx für die Familie Freescale Coldfire". Archiviert von das Original Am 2015-10-02.
- ^ Moshovos, Andreas. "Unterroutinen wurden fortgesetzt: Argumente übergeben, Werte zurückgeben und lokale Variablen zuweisen".
Alle Register außer D0, D1, A0, A1 und A7 sollten über einen Anruf erhalten bleiben.
- ^ IBM Corporation (1967). IBM 1130 Disk Monitor System, Version 2 Systemeinführung (C26-3709-0) (PDF). p. 67. Abgerufen 21. Dezember 2014.
- ^ IBM Corporation (1968). IBM 1130 Assemblersprache (C26-5927-4) (PDF). S. 24–25.
- ^ Smootherman, Mark (2004). "Unterroutine und Verfahrensanrufunterstützung: Frühgeschichte".
- ^ Rodriguez, Brad. "Beziehen Sie sich, Teil 1: Entwurfsentscheidungen im vierten Kernel".
Auf dem 6809 oder Zilog Super8 ist DTC schneller als STC.
- ^ Ertl, Anton. "Geschwindigkeit verschiedener Interpreter -Versandtechniken".
- ^ Zaleski, Mathew (2008). "Kapitel 4: Entwurf und Implementierung einer effizienten Interpretation". Yeti: Ein allmählich erweiterbarer Trace -Interpreter.
Obwohl bekanntermaßen Direktsthread-Dolmetscher von schlechten Branchen-Vorhersagemeigenschaften bezeichnet werden, kann die Latenz eines Aufrufs und Rückkehrs größer sein als ein indirekter Sprung.
Externe Links
- Johnson, Stephen Curtis; Ritchie, Dennis Macalistair (September 1981). "Technischer Bericht des Technischen Berichts Nr. 102: die C -Sprachanrufsequenz" C -Sprachanrufe ". Glockenlabors.
- Einführung in die Montage am PowerPC
- MAC OS X ABI -Funktionsaufrufhandbuch
- Verfahrensnotstandard für die ARM -Architektur
- Embedded -Programmierung mit der GNU Toolchain, Abschnitt 10. C Startup