我目前正致力于实施RV32I基本指令集。
我有一个关于ADDI指令的问题。在手册中,如何理解该子句" ADDI rd,rs1,0用于实现MV rd,rs1汇编伪指令。"
是否表示ADDI rd,rs1,0等于将rs1的内容移动到rd指定的寄存器?
答案 0 :(得分:2)
是ADDI rd, rs1, 0
执行操作:
rd <- rs1 + 0
,即rd <- rs1
所以ADDI rd, rs1, 0
执行MV rd, rs1
如果在问题中提到,它不会对rs1指定的寄存器执行rs1内容的移动(复制是一个更好的词)。 它执行rs1内容到寄存器rd的移动(再次复制)。
举个例子:
ADDI x3, x5, 0
会将x5
的内容复制到x3
- 并使用与上面相同的名称,在此示例中:rd
为x3
和{ {1}}是rs1
。
答案 1 :(得分:2)
mv x, y
(移动)伪指令只是addi x, y, 0
的别名。这意味着syntactic sugar是在汇编程序内部实现的。
由于mv
别名由汇编程序mv
解析,因此没有自己的操作码,因此不是真正的指令。因此,它称为伪指令。
使用mv
伪指令可以更清楚地描述代码的用途。当然,对于人类来说,它的键入和解析要少一些。
答案 2 :(得分:1)
是的,ADDI rd, rs1, 0
是MV rd, rs1
指令的编码。
许多编码都是可能的,例如XORI rd, rs1, 0
将具有相同的效果。
区分哪个编码的原因是当看到MV rd, rs1
时输出为ADDI rd, rs1, 0
的反汇编程序,但是XORI rd, rs1, 0
仍将被反汇编为XORI rd, rs1, 0
。 / p>
其他指令指定了编码,例如NOP为ADDI x0, x0, 0
,而不是其他不执行任何操作的指令。注意:寄存器0是 magic 。它始终读为零,因此写入丢失。
MV
指令将一个寄存器的值设置为等于另一个寄存器的值,因此最好将它们描述为“复制”,如@LiHenyuan所写。