jpseudo

j

pseudo
Assembly RISC-V Referência

lyszt.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