jalr

jalr

Assembleur RISC-V Référence

lyszt.net couvre jalr et d'autres instructions RISC-V plus en détail.

Format d'encodage

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

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