RV32I的控制转移指令可以分为无条件跳转(unconditional jumps)和条件分支(conditional branches)。其中,无条件跳转(unconditional jumps)包含JAL和JALR;条件分支(conditional branches)包含BEQ、BNE、BLT、BLTU、BGE和BGEU。这些控制转移指令会根据指令所带的立即数(imm)去计算跳转地址的偏移量,而这个偏移量的计算在这里有两种方式。
第一种偏移量计算方式:实际偏移量 = 立即数(imm)* 2
除了JALR之外的所有RV32I的控制转移指令,即:JAL、BEQ、BNE、BLT、BLTU、BGE和BGEU,都采用这种计算方式。在RV32I的规范中可以找到对应的内容。
JAL 规范P20
JAL 规范P21
条件分支(BEQ、BNE、BLT、BLTU、BGE和BGEU) 规范P22
这些指令在规范中都提到,立即数(imm)表达的是乘以2byte的偏移量,又因为RISCV的地址是b