【问题标题】:RISC-V NOP instructionRISC-V NOP 指令
【发布时间】:2018-11-22 05:55:19
【问题描述】:

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

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

谁能解释一下这一点?

【问题讨论】:

标签: assembly riscv nop


【解决方案1】:

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 的算术运算都将作为 无操作指令与源寄存器无关,因为最终结果将包括将程序计数器推进到下一条指令而不改变任何其他相关处理器的状态。

【讨论】:

    【解决方案2】:

    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 上没有进位标志),因此其行为类似于NOP。

    【讨论】:

    • 使用x1作为源会引入一个错误的依赖关系,如果它不是由x1编写的最后一条指令之后,它将停止执行nop。硬件为真正的nop。在架构上它当然仍然是一个 NOP,但在微架构上它在超标量(和/或无序)内核上可能会更糟。
    【解决方案3】:

    【讨论】:

    • 这是一个正确的说法,x0 保持常数 0,不能写入其他值。
    猜你喜欢
    • 2023-03-22
    • 2020-01-01
    • 2023-04-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多