可以看到偏移量是2字节对齐的(offset [20:1]),虽然RV32I中所有的指令地址都是4字节对齐的,但是JAL还可能被用于兼容C扩展指令集(详情见RISC-V 简介(4)RISC-V指令集编码结构中对其的描述),所以就默认offset bit 0为0(即2字节对齐)。 因此,JAL跳转的地址有+/- 1MB的范围。(2^21 = 2MB = +/- 1MB)。
因为JAL指令中的offset是相对于PC的偏移量,在编写时需要精确的地址差值,且任意添加/删除一条汇编指令,JAL中的偏移量可能就需要再次修改,这给JAL指令的使用带来了很大的负担,所以,一般在用JAL指令时,多用JAL rd,label而不是JAL rd,offset。 JAL rd,label中的label是标签,用来标注某段程序的位置,为程序中跳转及分...
在某些采用 BTB(Branch Target Buffer,分支目 标缓冲区)(用来记录之前发生过跳转的指令的 PC 值和目标地址)来做跳 转预测的处理器上,上面的跳转指令会在 BTB 中留下记录条目,但对跳转预 测却并无帮助,因为目标地址等同于下一条顺序执行的指令地址。 由此可见,AUIPC 的引入极大地减轻了编译器的负担。 注解:跳...
可以看到偏移量是2字节对齐的(offset [20:1]),虽然RV32I中所有的指令地址都是4字节对齐的,但是JAL还可能被用于兼容C扩展指令集(详情见RISC-V 简介(4)RISC-V指令集编码结构中对其的描述),所以就默认offset bit 0为0(即2字节对齐)。 因此,JAL跳转的地址有+/- 1MB的范围。(2^21 = 2MB = +/- 1MB)。
B型分支指令和J型跳转指令的地址需要左移1位(相当于乘以2),以获得更大的跳转范围。意味着:B型分支指令和J型跳转指令实际上只能跳转到偶数地址。 下面分别进行讲解: 1 RISC-V指令格式 1.1 R-type R-type是最常用的指令类型,表示寄存器-寄存器操作,指令的操作由7bit的opcode、3位的func3、7位的func7 共同决定...
指令示意: RV32I/RV64I指令: 伪指令: 2.6 分支指令 指令示意: RV32I/RV64I指令: 伪指令: 2.7 跳转指令 指令示意: RV32I/RV64I指令: 伪指令: 2.8 同步指令 2.9 环境指令 2.10 控制状态寄存器指令 指令示意: RV32I/RV64I指令: 伪指令:
分支指令的寻址方式是12位的立即数乘以2,符号扩展,然后加到PC上作为分支的跳转地址。
RISC-V架构有6条带条件跳转指令(Conditional Branch),这种带条件的跳转指令跟普通的运算指令一样直接使用2个整数操作数,然后对其进行比较,如果比较的条件满足时,则进行跳转。因此,此类指令将比较与跳转两个操作放到了一条指令里完成。 作为比较,很多的其他RISC架构的处理器需要使用两条独立的指令。第一条指令先使用比...
RISC-V 的比较跳转指令只有 blt 和 bge,即只有小于和大于等于。但大于和小于等于也是需要的,RISC-V用了一个很巧妙的办法用两条指令实现了四条指令的工作,将 blt 的两个参与比较的操作数位置换一下就有了 bgt(大于跳转),将bge 的两个参与比较的操作数位置换一下就有了 ble(小于或等于跳转)。
JAL和JALR是RISC-V指令集中的两条跳转指令,它们在实现跳转功能上有一些差异。 1. JAL(Jump and Link)指令是用于无条件跳转到目标地址的指令,同时将当前指令地址+4(PC+...