mv
pseudolyszt.net cubre mv y otras instrucciones RISC-V con más detalle.
Descripción
mv copia el valor de un registro a otro. El nombre es la abreviatura de move (mover). Después de la línea siguiente, ambos registros contienen el mismo valor y el origen, t0, no cambia.
mv a0, t0
mv es una pseudoinstrucción. El ensamblador reescribe este nombre legible como una instrucción real, que se muestra a continuación.
addi rd, rs, 0
Sumar cero a un valor y almacenarlo en otro lugar crea una copia. RISC-V no tiene una instrucción de movimiento dedicada y reutiliza la suma en su lugar.
Los distintos registros tienen distintas funciones, que es la razón habitual para usar mv. Por convención, los cálculos se realizan en los registros temporales (t0, t1, etc.). Cuando se llama a una función, sus argumentos van en registros específicos (a0, a1, etc.), y los resultados se devuelven en a0. Por lo tanto, un programa coloca un mv antes de una llamada, lo que pone un valor calculado en el registro que lee el código llamado, y un mv después de una llamada, lo que guarda un resultado devuelto en un lugar seguro.
mv a0, t0 call square mv s0, a0
Colocar los valores en los registros correctos en el momento correcto es una gran parte del ensamblador, y mv lo hace.
El manual de RISC-V afirma que addi con la constante 0 implementa la pseudoinstrucción del ensamblador mv.
Como mv copia el valor, cambiar el destino más tarde deja el origen sin cambios. Esto hace que mv sea útil para conservar una copia de un valor antes de que un bucle modifique el original. La traza del simulador muestra el addi que se ejecuta en lugar de mv.
Se expande a
addi rd, rs, 0
El ensamblador reemplaza esta pseudoinstrucción con la instrucción o instrucciones reales enumeradas arriba.
Ejemplo
li t0, 42 mv t1, t0 # t1 = 42
