mvпсевдо

mv

псевдо
RISC-V Ассемблер Ссылка

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