jrpseudo

jr

pseudo
Assembleur RISC-V Référence

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

Description

jr saute à une adresse stockée dans un registre. Le nom signifie jump register (saut vers registre). j saute à une étiquette fixe écrite dans le code. jr saute à l'adresse que contient un registre, que le programme détermine pendant son exécution. Il ne sauvegarde aucune adresse de retour.

jr est une pseudo-instruction pour la ligne ci-dessous, un saut vers registre qui abandonne l'adresse de retour (voir jalr).

jalr zero, rs, 0

Une table de saut est un tableau en mémoire qui contient les adresses de plusieurs routines, et jr est utilisé avec elle. Pour choisir la routine numéro i, le programme calcule son emplacement dans la table, charge l'adresse qui y est stockée dans un registre et utilise jr pour y sauter. Une seule consultation et un seul saut remplacent une longue série de comparaisons (est-ce le cas 0, le cas 1, le cas 2, etc.), quel que soit le nombre de cas. Les instructions switch denses et la boucle interne d'un interpréteur font leur dispatch de cette manière.

Le manuel RISC-V encode les sauts indirects inconditionnels simples comme un jalr avec rd réglé sur x0. Il note que jalr ne traite pas son immédiat comme un multiple de 2 octets, contrairement aux branches conditionnelles, et que la plupart des utilisations de jalr ont un immédiat nul ou viennent après un lui ou un auipc.

Revenir d'une fonction est un saut à l'adresse dans ra, donc ret est jr ra sous un autre nom. Le groupe des instructions de saut diffère par l'origine de l'adresse et par le fait qu'une adresse de retour est sauvegardée ou non.

Se développe en

jalr zero, rs, 0

L'assembleur remplace cette pseudo-instruction par la ou les instructions réelles listées ci-dessus.

Exemple

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