我目前正在实现RV32I基本指令集。
关于ADDI指令,我有一个问题。在手册中,如何理解这句话“ADDI rd,rs1,0用于实现MV rd,rs1汇编伪指令”。
这是否意味着ADDI rd,rs1,0等同于将rs1的内容移动到rd指定的寄存器中?
我目前正在实现RV32I基本指令集。
关于ADDI指令,我有一个问题。在手册中,如何理解这句话“ADDI rd,rs1,0用于实现MV rd,rs1汇编伪指令”。
这是否意味着ADDI rd,rs1,0等同于将rs1的内容移动到rd指定的寄存器中?
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
中,使用与上面相同的名称:在此示例中:rd
是x3
,rs1
是x5
。
mv x, y
(移动)伪指令只是addi x, y, 0
的别名。这意味着它是汇编器内部实现的语法糖。
由于汇编器解析了mv
别名,因此mv
没有自己的操作码,因此不是真正的指令。因此,它被称为伪指令。
使用mv
伪指令可以更清楚地描述您的代码目的。当然,对于人类来说,输入更少并且解析更少。
是的,ADDI rd, rs1, 0
是 MV 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 所写。