nop
伪lyszt.net 更详细地介绍了 nop 和其他 RISC-V 指令。
描述
nop 什么都不做。这个名字是 "no operation" 的缩写。当处理器到达 nop 时,寄存器不变,内存不被触碰,执行继续到下一条指令。它占用程序中的一个槽位,并经过一个时间 tick。
nop 是下面这一行的伪指令。
addi zero, zero, 0
RISC-V 包含一个名为 zero 的寄存器,它始终保存 0。读取返回 0,写入被丢弃。这个 addi 将 0 和 0 相加并丢弃结果,因此该指令完成,什么也不改变。RISC-V 不需要专用的 nop,因为 zero 寄存器就提供了一个。
真实处理器使用 nop 作为填充,以便后续指令从硬件处理更快的内存边界开始,也用作占位符,供工具稍后用真实指令覆盖。编译器会自然而然地插入它们,这就是为什么反汇编代码中包含它们,即使没有程序员键入它们。
RISC-V 手册指出,nop 不改变任何架构上可见的状态,即程序可以观察到的任何东西,除了推进 pc 和递增任何性能计数器。它给出了两种用途:将代码段对齐到适合硬件的地址边界,以及为以后对代码的更改留出空间。手册解释说,该编码使用 addi,因为该指令在大多数系统上消耗的资源最少,因为它只读取一个寄存器。
在这个模拟器中,nop 在实验期间充当间隔或标记。单步越过一个会使 pc 向前移动 4,并且不改变任何寄存器或内存位置。
展开为
addi zero, zero, 0
汇编器会将此伪指令替换为上面列出的真实指令或指令。
示例
li t0, 1 nop # advances one instruction, changes nothing addi t0, t0, 1 # t0 = 2
