mv
pseudolyszt.net aborda mv e outras instruções RISC-V com mais detalhes.
Descrição
mv copia o valor de um registrador para outro. O nome é a abreviação de move. Após a linha abaixo, ambos os registradores contêm o mesmo valor e a origem, t0, permanece inalterada.
mv a0, t0
mv é uma pseudoinstrução. O montador reescreve este nome legível em uma instrução real, mostrada abaixo.
addi rd, rs, 0
Adicionar zero a um valor e armazená-lo em outro lugar faz uma cópia. O RISC-V não tem uma instrução de movimentação dedicada e reutiliza a adição em vez disso.
Registradores diferentes têm funções diferentes, o que é a razão usual para usar mv. Por convenção, os cálculos acontecem nos registradores temporários (t0, t1 e assim por diante). Quando uma função é chamada, seus argumentos vão em registradores específicos (a0, a1 e assim por diante), e os resultados retornam em a0. Um programa, portanto, coloca um mv antes de uma chamada, o que coloca um valor calculado no registrador que o código chamado lê, e um mv após uma chamada, o que salva um resultado retornado em um local seguro.
mv a0, t0 call square mv s0, a0
Colocar valores nos registradores certos no momento certo é grande parte da programação em assembly, e mv faz isso.
O manual do RISC-V afirma que addi com a constante 0 implementa a pseudoinstrução de montador mv.
Como mv copia o valor, alterar o destino depois deixa a origem inalterada. Isso torna mv útil para manter uma cópia de um valor antes que um loop altere o original. O trace do simulador mostra o addi que é executado no lugar de mv.
Expande para
addi rd, rs, 0
O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.
Exemplo
li t0, 42 mv t1, t0 # t1 = 42
