jr
pseudolyszt.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
