jrpseudo

jr

pseudo
Assembly RISC-V Referência

lyszt.net aborda jr e outras instruções RISC-V com mais detalhes.

Descrição

jr salta para um endereço armazenado em um registrador. O nome significa jump register (salto para registrador). j salta para um rótulo fixo escrito no código. jr salta para qualquer endereço que um registrador contenha, o qual o programa descobre enquanto executa. Ele não salva nenhum endereço de retorno.

jr é uma pseudoinstrução para a linha abaixo, um salto para registrador que descarta o endereço de retorno (veja jalr).

jalr zero, rs, 0

Uma tabela de saltos é um array na memória que contém os endereços de várias rotinas, e jr é usado com ela. Para escolher a rotina número i, o programa calcula seu slot na tabela, carrega o endereço armazenado ali em um registrador e usa jr para saltar até ele. Uma consulta e um salto substituem uma longa série de comparações (é o caso 0, o caso 1, o caso 2 e assim por diante), qualquer que seja o número de casos. Instruções switch densas e o laço interno de um interpretador fazem o despacho dessa forma.

O manual do RISC-V codifica saltos indiretos incondicionais simples como um jalr com rd definido como x0. Ele observa que jalr não trata seu imediato como um múltiplo de 2 bytes, ao contrário dos desvios condicionais, e que a maioria dos usos de jalr tem um imediato zero ou vem depois de um lui ou auipc.

Retornar de uma função é um salto para o endereço em ra, então ret é jr ra com outro nome. O grupo de instruções de salto difere em relação a de onde vem o endereço e se um endereço de retorno é salvo.

Expande para

jalr zero, rs, 0

O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.

Exemplo

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