j
pseudolyszt.net aborda j e outras instruções RISC-V com mais detalhes.
Descrição
j realiza o salto mais simples: ele sempre transfere o controle para um rótulo, sem nenhuma condição associada. Uma instrução de desvio transfere o controle apenas quando uma comparação é bem-sucedida. A sintaxe é j label.
Este é um salto incondicional, também conhecido como goto. Loops e blocos if/else dependem dele. Um loop básico coloca um desvio condicional no topo para decidir quando sair, executa o corpo do loop e termina com um j que retorna ao topo para a próxima passagem. Sem esse salto, a execução cai no final e o loop nunca se repete. Em um if e else, um j no final do bloco if pula sobre o bloco else, de modo que apenas um dos dois blocos é executado.
j não registra um endereço de retorno, o que o distingue de uma chamada de função. Use j para se mover dentro do seu código, seja para loops ou para pular um bloco, e use call quando a execução precisar retornar. O fator decisivo é se um retorno é necessário.
O manual do RISC-V codifica saltos incondicionais simples como um jal com rd definido como x0. Ele afirma que esse salto deve sempre ser usado para desvios incondicionais em vez de um desvio condicional cuja condição é sempre verdadeira. Os saltos também são relativos ao pc, cobrem uma faixa muito mais ampla que os desvios e deixam as tabelas de predição de desvio condicional intactas.
j é uma pseudoinstrução para a linha abaixo.
jal zero, label
Este é um jump and link que escreve o endereço de retorno no registrador zero, que o descarta, deixando apenas o salto. O exemplo salta de volta para o topo de um loop.
Expande para
jal zero, label
O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.
Exemplo
j loop # go back to the top of the loop
Referências
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.1, Unconditional Jumps, page 30.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.2, Conditional Branches, pages 31 to 32.
