mv
псевдоlyszt.net охоплює mv та інші інструкції RISC-V більш детально.
Опис
mv копіює значення одного регістра в інший. Назва — скорочення від move (перемістити). Після наведеного нижче рядка обидва регістри містять те саме значення, а джерело, t0, залишається незмінним.
mv a0, t0
mv — це псевдоінструкція. Асемблер переписує це зрозуміле ім'я в справжню інструкцію, показану нижче.
addi rd, rs, 0
Додавання нуля до значення та збереження його в іншому місці створює копію. У RISC-V немає окремої інструкції переміщення, і замість неї використовується додавання.
Різні регістри виконують різні завдання, і це звичайна причина використовувати mv. За домовленістю обчислення відбуваються в тимчасових регістрах (t0, t1 тощо). Коли викликається функція, її аргументи потрапляють у певні регістри (a0, a1 тощо), а результати повертаються в a0. Тому програма ставить mv перед викликом, що поміщає обчислене значення в регістр, який читає викликаний код, і mv після виклику, що зберігає повернутий результат у безпечному місці.
mv a0, t0 call square mv s0, a0
Розміщення значень у потрібних регістрах у потрібний момент — це значна частина роботи з асемблером, і mv робить це.
У посібнику з RISC-V зазначено, що addi з константою 0 реалізує псевдоінструкцію асемблера mv.
Оскільки mv копіює значення, подальша зміна призначення залишає джерело незмінним. Це робить mv корисною для збереження копії значення до того, як цикл змінить оригінал. Трасування симулятора показує addi, який виконується замість mv.
Розгортається до
addi rd, rs, 0
Асемблер замінює цю псевдоінструкцію реальною інструкцією або інструкціями, переліченими вище.
Приклад
li t0, 42 mv t1, t0 # t1 = 42
