我最近正在研究RISC-V 32I指令。我得到了一个关于NOP
指令的问题,规范说明它等于ADDI x0, x0, 0
但是,x0不是可由程序员修改的通用寄存器。那么,为什么x0在这里用作NOP指令的目标寄存器?
有人可以就这一点发表一些看法吗?
答案 0 :(得分:5)
NOP
是扩展到ADDI x0, x0, 0
的伪指令。 x0
(或zero
)是专用于值零的只读寄存器,即,每硬连线为零一点。写入该寄存器的任何内容都将被丢弃,因为其值无法修改。
来自The RISC-V Instruction Set Manual Volume I: Unprivileged ISA:
NOP
指令不会更改任何体系结构可见的状态,除了前进pc
并增加任何适用的性能计数器外。NOP
被编码为ADDI x0, x0, 0
。
请记住,RISC-V没有算术标志(例如,进位,溢出,零,符号标志),目标寄存器为x0
的任何算术运算都将作为无操作指令与源寄存器无关,因为最终结果将包括将程序计数器推进到下一条指令,而不会更改任何其他相关处理器的状态。
答案 1 :(得分:1)
https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md
或https://riscv.org/specifications/
的第109页注册x0硬连接到零
答案 2 :(得分:0)
oystercatcher引用正确的语句,x0保持常量0并且不能写入另一个值。
指令ADDI x0, x0, 0
执行x0 <- x0 + 0
,其中0是指令中的立即编码。这样的指令对RISCV的状态没有影响,因此是一个NOP。
RISCV NOP
的其他替代方法:ADDI x0, x1, 0
。即使ADD x0, x1, x2
也不会影响RISCV(RISCV上没有Carry标志),因此行为类似于NOP
。