7

我最近正在研究 RISC-V 32I 指令。我有一个关于NOP指令的问题,规范说它等于ADDI x0, x0, 0.

但是,x0它不是一个可以被程序员修改的通用寄存器。因此,为什么x0在这里用作NOP指令的目标寄存器?

任何人都可以在这一点上阐明一些观点吗?

4

3 回答 3

5

NOP 是扩展为 的伪指令ADDI x0, x0, 0。(x0zero) 是专用于零值的只读寄存器,即,对于每个单个位,它都被硬连线为零。写入该寄存器的任何内容都将被丢弃,因为它的值无法修改。

来自RISC-V 指令集手册第一卷:非特权 ISA

NOP指令不改变任何架构上可见的状态,除了推进pc和递增任何适用的性能计数器。 NOP被编码为ADDI x0, x0, 0

请记住,RISC-V 没有算术标志(即进位、溢出、零、符号标志),任何目标寄存器为的算术运算都x0将作为无操作指令执行,而不管源寄存器如何,因为最终结果将包括将程序计数器推进到下一条指令,而不改变任何其他相关处理器的状态。

于 2019-08-03T09:16:31.530 回答
3

oystercatcher 引用了一个正确的语句,x0 保持常数 0 并且不能写入另一个值。

指令ADDI x0, x0, 0执行x0 <- x0 + 0,其中 0 是指令中编码的立即数。这样的指令对 RISCV 的状态没有影响,因此是 NOP。

NOPRISCV 上的其他替代方案: ADDI x0, x1, 0. EvenADD x0, x1, x2对 RISCV 没有影响(RISCV 上没有进位标志),因此其行为类似于NOP.

于 2018-06-18T19:18:19.377 回答
1

https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md

或在 https://riscv.org/specifications/的第 109 页

寄存器 x0 硬连线为零

于 2018-06-13T16:07:58.980 回答