jrPseudoelement

jr

Pseudoelement
RISC-V Assembler Referenz

lyszt.net behandelt jr und andere RISC-V-Befehle ausführlicher.

Beschreibung

jr springt zu einer Adresse, die in einem Register gespeichert ist. Der Name steht für jump register (Sprung zu Register). j springt zu einem festen Label, das im Code steht. jr springt zu der Adresse, die ein Register enthält, die das Programm zur Laufzeit ermittelt. Es speichert keine Rücksprungadresse.

jr ist eine Pseudoinstruktion für die folgende Zeile, ein Registersprung, der die Rücksprungadresse verwirft (siehe jalr).

jalr zero, rs, 0

Eine Sprungtabelle ist ein Array im Speicher, das die Adressen mehrerer Routinen enthält, und jr wird damit verwendet. Um Routine Nummer i auszuwählen, berechnet das Programm ihren Platz in der Tabelle, lädt die dort gespeicherte Adresse in ein Register und verwendet jr, um dorthin zu springen. Ein Nachschlagen und ein Sprung ersetzen eine lange Reihe von Vergleichen (ist es Fall 0, Fall 1, Fall 2 und so weiter), unabhängig von der Anzahl der Fälle. Dichte switch-Anweisungen und die innere Schleife eines Interpreters machen ihren Dispatch auf diese Weise.

Das RISC-V-Handbuch kodiert einfache unbedingte indirekte Sprünge als jalr mit rd auf x0 gesetzt. Es merkt an, dass jalr sein Immediate nicht als ein Vielfaches von 2 Bytes behandelt, anders als die bedingten Sprünge, und dass die meisten Verwendungen von jalr ein Null-Immediate haben oder nach einem lui oder auipc kommen.

Die Rückkehr aus einer Funktion ist ein Sprung zur Adresse in ra, also ist ret ein jr ra unter anderem Namen. Die Gruppe der Sprungbefehle unterscheidet sich darin, woher die Adresse kommt und ob eine Rücksprungadresse gespeichert wird.

Wird erweitert zu

jalr zero, rs, 0

Der Assembler ersetzt diese Pseudoanweisung durch die oben aufgeführte(n) echte(n) Anweisung(en).

Beispiel

la t0, target
jr t0            # jump to the address held in t0