j
伪lyszt.net 更详细地介绍了 j 和其他 RISC-V 指令。
描述
j 执行最简单的跳转:它总是将控制权转移到某个标签,不附加任何条件。分支指令仅在比较成功时才转移控制权。语法为 j label。
这是无条件跳转,也称为 goto。循环和 if/else 块都依赖它。一个基本循环在顶部放置条件分支来决定何时离开,运行循环体,并以一个 j 结束,该 j 返回顶部以进行下一轮。没有这个跳转,执行会从末尾落下,循环永远不会重复。在 if 和 else 中,if 块末尾的 j 会跳过 else 块,因此两个块中只有一个会运行。
j 不记录返回地址,这使它有别于函数调用。使用 j 在代码内部移动,无论是用于循环还是跳过某个块,而当执行必须返回时使用 call。决定因素是是否需要返回。
RISC-V 手册将简单的无条件跳转编码为 rd 设置为 x0 的 jal。它指出,无条件分支应始终使用此跳转,而不是使用条件始终为真的条件分支。跳转也是 pc 相对的,覆盖范围比分支宽得多,并且不会触动条件分支预测表。
j 是下面这一行的伪指令。
jal zero, label
这是一个 jump and link,它将返回地址写入 zero 寄存器,该寄存器会将其丢弃,只留下跳转。该示例跳回循环顶部。
展开为
jal zero, label
汇编器会将此伪指令替换为上面列出的真实指令或指令。
示例
j loop # go back to the top of the loop
简三的图詰
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.1, Unconditional Jumps, page 30.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.2, Conditional Branches, pages 31 to 32.
