RISC-V ADDI 指令

7

我目前正在实现RV32I基本指令集。

关于ADDI指令,我有一个问题。在手册中,如何理解这句话“ADDI rd,rs1,0用于实现MV rd,rs1汇编伪指令”。

这是否意味着ADDI rd,rs1,0等同于将rs1的内容移动到rd指定的寄存器中?

3个回答

4

ADDI rd, rs1, 0执行的操作是:

rd <- rs1 + 0,也就是说rd <- rs1

所以ADDI rd, rs1, 0相当于执行MV rd, rs1

它并不是像问题中提到的那样将rs1的内容移动(复制更准确)到指定的寄存器rd中,而是将rs1的内容移动(再次复制)到寄存器rd中。

举个例子:

ADDI x3, x5, 0会将x5的内容复制到x3中,使用与上面相同的名称:在此示例中:rdx3rs1x5


2

mv x, y(移动)伪指令只是addi x, y, 0的别名。这意味着它是汇编器内部实现的语法糖

由于汇编器解析了mv别名,因此mv没有自己的操作码,因此不是真正的指令。因此,它被称为伪指令。

使用mv伪指令可以更清楚地描述您的代码目的。当然,对于人类来说,输入更少并且解析更少。


2

是的,ADDI rd, rs1, 0MV rd, rs1 指令的编码。

许多编码都是可能的,例如 XORI rd, rs1, 0 具有相同的效果。

指定所选择的编码的原因是,反汇编器在看到 ADDI rd, rs1, 0 时会输出 MV rd, rs1,但是仍然将 XORI rd, rs1, 0 反汇编为 XORI rd, rs1, 0

其他指令具有指定的编码,例如 NOP 是 ADDI x0, x0, 0,而不是任何其他什么都不做的指令。注意:寄存器 0 是 magic。它总是读零,因此写入将被丢弃。

MV 指令将一个寄存器的值设置为另一个寄存器的值,因此最好将它们描述为“复制”,如 @LiHenyuan 所写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接