mv
伪lyszt.net 更详细地介绍了 mv 和其他 RISC-V 指令。
描述
mv 将一个寄存器的值复制到另一个寄存器。这个名字是 move 的缩写。执行下面这行之后,两个寄存器持有相同的值,而源寄存器 t0 保持不变。
mv a0, t0
mv 是一条伪指令。汇编器会把这个易读的名称重写成一条真正的指令,如下所示。
addi rd, rs, 0
给一个值加上零并把它存到别处,就实现了复制。RISC-V 没有专门的 move 指令,而是复用了加法。
不同的寄存器有不同的职责,这是使用 mv 的常见原因。按照惯例,计算在临时寄存器(t0、t1 等)中进行。当函数被调用时,它的参数放在特定的寄存器(a0、a1 等)中,结果通过 a0 返回。因此程序会在调用之前放置一条 mv,把计算出的值放入被调用代码所读取的寄存器,并在调用之后放置一条 mv,把返回的结果保存到安全的地方。
mv a0, t0 call square mv s0, a0
在正确的时刻把值放入正确的寄存器是汇编的很大一部分内容,而 mv 正是做这件事的。
RISC-V 手册指出,带有常量 0 的 addi 实现了 mv 汇编伪指令。
由于 mv 复制的是值,之后修改目标寄存器不会改变源寄存器。这使得 mv 在循环改变原值之前保留一份值的副本时很有用。模拟器的跟踪显示了代替 mv 执行的 addi。
展开为
addi rd, rs, 0
汇编器会将此伪指令替换为上面列出的真实指令或指令。
示例
li t0, 42 mv t1, t0 # t1 = 42
