我们知道它jal
指定了一个 21 位的偏移量。但是,它不编码 21 位偏移量,而是 20 位偏移量。原因是地址的最低有效位始终为零,因为可能的最小 RISC-V 指令为 2 个字节,因此该位未在指令中编码。
通过以这种方式对偏移进行编码,它可以提供 ±1MiB 的跳跃范围。如果jal
确实对 LSB 进行编码,它将仅提供 ±512KiB 的跳跃范围。
但是,jalr
指定 12 位偏移量的指令确实对 LSB 进行了编码。这会将跳跃范围减小到 ±2kiB(而不是 ±4kiB)。我知道它jalr
使用 I 型格式,与addi
这种指令的立即数的 LSB 相同,并且必须对这种指令进行编码。但是,我看不出为什么必须对最低有效位进行编码jalr
。