jal

jal

Assembleur RISC-V Référence

lyszt.net couvre jal 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

jal appelle une fonction. Une fonction est un bloc nommé d'instructions qui peut être exécuté depuis plusieurs endroits puis revenir, de sorte que la logique est écrite une fois et utilisée n'importe où. Appeler une fonction nécessite deux choses. Le programme saute à l'endroit où se trouve la fonction, et il se souvient d'où il vient pour y revenir ensuite. jal fait les deux, et son nom signifie jump and link.

Le saut va vers une étiquette qui marque la fonction. La partie link se produit avant le saut. jal enregistre l'adresse de l'instruction suivante, celle juste après l'appel, dans un registre. La fonction utilise cette adresse enregistrée pour revenir.

Par convention, l'adresse enregistrée va dans un registre nommé ra, pour return address. La ligne ci-dessous saute vers la fonction square et laisse dans ra l'adresse de retour.

jal ra, square

Lorsque la fonction se termine, elle revient en sautant à l'adresse contenue dans ra, ce que fait l'instruction ret. La notation abrégée habituelle pour le même appel est montrée ci-dessous.

call square

Le manuel RISC-V indique que le décalage de saut est compté en multiples de 2 octets, étendu en signe et ajouté à l'adresse de l'instruction de saut. Cela donne une plage de plus ou moins 1 MiB, où un MiB vaut 1 048 576 octets. jal stocke l'adresse de l'instruction suivante, qui est pc plus 4, dans rd. La convention d'appel logicielle standard utilise x1 comme registre d'adresse de retour et x5 comme registre de lien alternatif. Les instructions de saut inconditionnel utilisent l'adressage relatif au pc, ce qui prend en charge le code indépendant de la position, c'est-à-dire du code qui fonctionne partout où il est chargé en mémoire.

Un jal écrase ra avec une nouvelle adresse de retour. Si une fonction appelle une autre fonction, l'appel interne remplace l'adresse enregistrée de l'appel externe. Une fonction qui effectue ses propres appels doit d'abord sauvegarder ra et le restaurer avant de revenir. L'exemple appelle square et laisse l'adresse de retour dans ra.

Exemple

jal ra, square   # call square; ra holds the return address