ret
Pseudoelementlyszt.net behandelt ret und andere RISC-V-Befehle ausführlicher.
Beschreibung
ret kehrt aus einer Funktion zurück und übergibt die Kontrolle an den Aufrufer. Ein call erwartet eines. Wenn eine Funktion aufgerufen wird, legt der Aufrufer eine Rücksprungadresse in das Register ra (siehe call und jal), und ret springt zu dieser Adresse, die direkt nach dem ursprünglichen Aufruf fortfährt. Es ist eine Pseudoinstruktion, die zu ra springt.
ret funktioniert nur, wenn ra noch die richtige Adresse enthält. In einer Funktion, die nichts anderes aufruft, ändert nichts ra zwischen Eintritt und Austritt. Ein call innerhalb der Funktion überschreibt ra mit einer neuen Rücksprungadresse und löscht die, die die Funktion benötigt. Eine Funktion, die andere aufruft, sichert ihr ra beim Eintritt und stellt es vor ret wieder her. Ohne die Wiederherstellung kehrt die Funktion an die falsche Stelle zurück, und das Programm springt in unrelated code oder läuft endlos in einer Schleife.
Konventionell legt eine Funktion ihr Ergebnis vor der Rückkehr in das Register a0, und der Aufrufer liest es dort.
Das RISC-V-Handbuch sagt, dass eine Prozedurrückkehr in der Standard-Aufrufkonvention als jalr mit rd=x0, rs1=x1 und einem Immediate von 0 kodiert wird. Sie springt zur Adresse in x1 und schreibt keine Link-Adresse, da x0 sie verwirft. Das Handbuch fügt hinzu, dass Prozessoren die Registernummern in jal und jalr als Hinweise verwenden, um Funktionsrückkehr vorherzusagen, was einer der Gründe ist, warum die Standardkonvention die Rücksprungadresse in x1 behält.
Das Beispiel ist die einfachste vollständige Funktion. square multipliziert sein Argument mit sich selbst und ret gibt das Ergebnis zurück. Sie ruft nichts anderes auf, also sichert und stellt sie nichts wieder her. Wenn man sie im Simulator ausführt, springt die Kontrolle zum Aufrufer zurück.
Wird erweitert zu
jalr zero, ra, 0
Der Assembler ersetzt diese Pseudoanweisung durch die oben aufgeführte(n) echte(n) Anweisung(en).
Beispiel
square: mul a0, a0, a0 ret # return to the caller
