jrpseudo

jr

pseudo
Ensamblador RISC-V Referencia

lyszt.net cubre jr y otras instrucciones RISC-V con más detalle.

Descripción

jr salta a una dirección almacenada en un registro. El nombre significa jump register (salto a registro). j salta a una etiqueta fija escrita en el código. jr salta a la dirección que contenga un registro, la cual el programa determina mientras se ejecuta. No guarda ninguna dirección de retorno.

jr es una pseudoinstrucción para la línea de abajo, un salto a registro que descarta la dirección de retorno (véase jalr).

jalr zero, rs, 0

Una tabla de saltos es un arreglo en memoria que contiene las direcciones de varias rutinas, y jr se usa con ella. Para elegir la rutina número i, el programa calcula su posición en la tabla, carga la dirección almacenada allí en un registro y usa jr para saltar a ella. Una consulta y un salto reemplazan una larga serie de comparaciones (¿es el caso 0, el caso 1, el caso 2 y así sucesivamente), sea cual sea el número de casos. Las sentencias switch densas y el bucle interno de un intérprete despachan de esta manera.

El manual de RISC-V codifica los saltos indirectos incondicionales simples como un jalr con rd puesto a x0. Señala que jalr no trata su inmediato como un múltiplo de 2 bytes, a diferencia de las bifurcaciones condicionales, y que la mayoría de los usos de jalr tienen un inmediato cero o vienen después de un lui o un auipc.

Volver de una función es un salto a la dirección en ra, así que ret es jr ra con otro nombre. El grupo de instrucciones de salto difiere en de dónde viene la dirección y en si se guarda una dirección de retorno.

Se expande a

jalr zero, rs, 0

El ensamblador reemplaza esta pseudoinstrucción con la instrucción o instrucciones reales enumeradas arriba.

Ejemplo

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