callpseudo

call

pseudo
Assembly RISC-V Referência

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

Descrição

call executa uma função e trata o retorno. Ela salta para a função e armazena o endereço de retorno em ra, o que permite que a função volte. É uma pseudoinstrução que geralmente se expande para a instrução abaixo.

jal ra, label

Quando uma função está longe demais para que um único salto a alcance, o montador substitui por uma sequência mais longa que cobre a distância. Escrever call com o nome da função declara a intenção e deixa a escolha da forma para o montador. A entrada jal descreve o salto e o salvamento do endereço de retorno. A linha abaixo chama a função square.

call square

Chamar uma função também exige um acordo sobre como as informações passam entre o chamador e o chamado. Esse acordo é a convenção de chamada. O chamador coloca as entradas da função nos registradores de argumentos, nomeados a0, a1 e assim por diante, e lê o resultado de a0 quando a função retorna. Ambos os lados seguem a mesma regra, então código escrito separadamente ainda funciona em conjunto.

Todo call sobrescreve ra. Uma função que faz chamadas próprias salva o ra que recebeu antes de fazê-las, e depois restaura esse valor antes de seu próprio retorno. Sem isso, o endereço de retorno da chamada interna substitui o da externa e a função não consegue voltar. Uma função que não chama nada mais não precisa salvar ra.

O manual do RISC-V afirma que a convenção de chamada de software padrão usa x1 como registrador de endereço de retorno. Um jal alcança alvos dentro de mais ou menos 1 MiB, onde um MiB é 1.048.576 bytes. Um alvo mais distante exige um auipc seguido de jalr, que alcança qualquer lugar em um intervalo de endereços relativos ao pc de 32 bits.

O exemplo chama square com 6 em a0 e encontra 36 em a0 depois. O argumento entra e o resultado sai pela convenção.

Expande para

jal ra, label

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

Exemplo

call square      # jumps to square; ra holds the return address