jalr
lyszt.net couvre jalr et d'autres instructions RISC-V plus en détail.
Format d'encodage
Description
jalr appartient à la même famille que jal, le r signifiant registre. Les deux instructions effectuent un saut et enregistrent une adresse de retour, comme décrit sur la page jal. La différence réside dans la cible du saut. jal saute vers une étiquette fixée lors de l'écriture du programme, tandis que jalr saute vers une adresse contenue dans un registre, ce qui permet de calculer la destination à l'exécution.
C'est ce qui permet à une fonction de revenir. L'appelant place une adresse de retour dans le registre ra, et la fonction revient en utilisant jalr pour atteindre l'adresse contenue dans ra. L'instruction ret est un jalr vers ra.
La même capacité s'applique chaque fois que la destination est inconnue à l'avance. Elle couvre les appels à une fonction dont l'adresse a été passée en argument, et la sélection parmi des routines listées dans une table d'adresses, ce qui est la manière dont une grande instruction switch ou un interpréteur effectue sa répartition.
Selon le manuel RISC-V, jalr ajoute l'immédiat de 12 bits étendu en signe au registre rs1, puis efface le bit de poids faible du résultat. Il stocke l'adresse de l'instruction suivante, pc plus 4, dans rd, et x0 peut servir de destination lorsqu'aucune adresse de retour n'est nécessaire. Un lui suivi d'un jalr atteint n'importe quelle adresse absolue de 32 bits, et un auipc suivi d'un jalr atteint n'importe quelle adresse relative au pc de 32 bits. Les deux instructions de saut lèvent une exception si l'adresse cible n'est pas alignée sur une frontière de quatre octets.
Le format de jalr apparaît ci-dessous. Il saute vers l'adresse contenue dans le registre rs plus un petit décalage optionnel, et stocke l'adresse de retour dans rd.
jalr rd, rs, offset
Comme pour jal, le registre qu'il écrit est écrasé, donc le même soin concernant la préservation de ra s'applique.
Exemple
la t0, target jalr ra, t0, 0 # jump to target; ra holds the return address
Références
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.1, Unconditional Jumps, page 30.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.1, Integer Register-Immediate Instructions, pages 28 to 29.
