我最近正在研究 RISC-V 32I 指令。我有一个关于NOP
指令的问题,规范说它等于ADDI x0, x0, 0
.
但是,x0
它不是一个可以被程序员修改的通用寄存器。因此,为什么x0
在这里用作NOP
指令的目标寄存器?
任何人都可以在这一点上阐明一些观点吗?
NOP
是扩展为 的伪指令ADDI x0, x0, 0
。(x0
或zero
) 是专用于零值的只读寄存器,即,对于每个单个位,它都被硬连线为零。写入该寄存器的任何内容都将被丢弃,因为它的值无法修改。
该
NOP
指令不改变任何架构上可见的状态,除了推进pc
和递增任何适用的性能计数器。NOP
被编码为ADDI x0, x0, 0
。
请记住,RISC-V 没有算术标志(即进位、溢出、零、符号标志),任何目标寄存器为的算术运算都x0
将作为无操作指令执行,而不管源寄存器如何,因为最终结果将包括将程序计数器推进到下一条指令,而不改变任何其他相关处理器的状态。
oystercatcher 引用了一个正确的语句,x0 保持常数 0 并且不能写入另一个值。
指令ADDI x0, x0, 0
执行x0 <- x0 + 0
,其中 0 是指令中编码的立即数。这样的指令对 RISCV 的状态没有影响,因此是 NOP。
NOP
RISCV 上的其他替代方案: ADDI x0, x1, 0
. EvenADD x0, x1, x2
对 RISCV 没有影响(RISCV 上没有进位标志),因此其行为类似于NOP
.
https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md
或在 https://riscv.org/specifications/的第 109 页
寄存器 x0 硬连线为零