mv

RISC-V mv 伪指令详解

汇编器伪指令

寄存器间数据复制伪指令,展开为 addi rd, rs, 0。比直接写 ADDI 更清晰地表达赋值语义。在编译器中频繁用于寄存器分配、函数参数准备和临时值保存。

你写下的是
mv rd, rs
常见真实展开
addi rd, rs, 0

这条伪指令到底在帮你省什么

提高可读性,比直接写 addi rd, rs, 0 更明确表达「赋值/移动」意图。编译器中 mov 是最常见的中间表示操作之一。

mv 的核心作用是“寄存器间数据复制”。它是汇编器层面的简写;调试、审计或阅读机器码时,应回到页面列出的真实展开指令和相关重定位语义来判断行为。

官方语义核对重点

官方汇编手册把 mv 作为汇编器层面的伪指令/别名处理,硬件执行的是展开后的真实指令序列。
真实语义以 ADDI 等展开指令的 ISA 定义为准;本页不把 mv 当作独立硬件 opcode。

展开过程怎么理解

步骤 1
汇编器展开为 addi rd, rs, 0。
步骤 2
ADDI 将 rs + 0 的结果写入 rd,等效于 rd = rs。不改变任何体系结构状态(除 rd 外)。

在 objdump / 反汇编里可能看到什么

addi rd, rs, 0 在反汇编中显示为 mv rd, rs。注意 mv 不修改任何标志位——纯粹的数据复制。

官方依据与阅读顺序

本页把伪指令当作汇编器层面的别名或宏来解释:先看它会展开成哪些真实指令,再回到官方 ISA 手册理解真实指令的行为。涉及 ABI、重定位或链接器松弛时,以 psABI 文档为准。

什么时候优先想到它

保存临时计算结果到另一个寄存器
寄存器间变量赋值与传递
为函数调用准备参数(如 mv a0, t0)
编译器寄存器分配中的 copy 传递

容易混淆 / 常见误区

MV 是纯粹的数据复制,不检查零或符号位——与 seqz/snez 不同
RV64 中 MV 作用于整个 XLEN(64位),不是仅低 32 位
mv rd, rs 在 rs=x0 时等价于 li rd, 0(清零操作)

常见问题

mv 是真实 RISC-V 指令吗?

mv 是汇编器伪指令或别名,不是单独硬件 opcode。页面中的“常见真实展开”列出官方展开,真实行为由展开后的 ISA 指令决定。

使用 mv 时最容易误解什么?

MV 是纯粹的数据复制,不检查零或符号位——与 seqz/snez 不同