在以前的文章中,我分享了RISC-V用户可以在基本指令集的基础上面,进行定制化的设计,但是无论怎样,都要能够支撑整数基本指令集,可以看出基本指令集的重要性。我们已经详细介绍了RISC-V中非常重要的整数计算指令。想了解的同学可以看以前的文章“浅谈RISC-V指令集(二)- 整数计算指令”。今天我们继续分享RISC-V中的控制转移指令。
在RISC-V中常见的控制转移指令,主要有两类,如下所示:
无条件跳转指令使用的是UJ类指令格式,立即数J在这里表示编码了一个2N的有符号数偏移量。在使用时,先对J进行符号扩展,再加到pc,就构成了跳转的目标地址,需要说明的是跳转的范围还是比较客观,可以到[-1MB,1MB]的范围。然后将跳转指令后面指令的地址(pc+4)放到rd寄存器中。
通常情况下,一般的无条件跳转指令,会被编码为rd=x0的指令。
在RISC-V中,间接跳转指令一般采用I类编码。基本指令格式如下图所示:
指令具体的操作步骤为:12bit的有符号数I类立即数加上基址rs1,得到结果。将结果中的最低位置0,将结果作为目标地址。跳转指令之后指令的地址为(pc+4),将这个结果保存到rd寄存器中。需要说明的是,如果不需要保留结果,就可以直接把x0当做目标寄存器。
特别的,如果得到的目标地址没有对齐到4bit边界,则无条件跳转指令和间接跳转指令都要产生一个指令取指的非对齐异常。
在RISC-V中,为了支持代码的位置无关性,所有的无条件跳转指令都采用pc相对寻址的方式,通过采用双指令序列的方式,可以跳转到32位地址空间的所有位置。具体过程是,首先将目标地址的高20bit加载到基址rs1中,接着间接跳转指令加上低12bit,就可以任意跳转到32位地址空间的任何地方。
需要注意的是,间接跳转指令和条件分支指令不同之处在于,间接跳转指令并不把12位立即数当做2bit的倍数。这样设计可以防止在硬件上再多出一种格式。间接跳转指令在设计上不考虑目标地址的最低位,有两个好处:
这样做的后果是,会带来一些误差,因为可能导致目的指令地址错误,从而导致异常的产生。
在基址rs1=x0的情况下,间接跳转指令为了达到对小的运行时库调用快速的目的,可以通过单一指令的调用,进而做到从任意地址对最大正负2KB地址区域的调用。
我们分享的RISC-V中,控制转移指令可以分为无条件转移,条件分支两种。今天只分享了无条件转移,后面我会继续分享条件分支以及RISC-V的其他指令内容,欢迎大家继续关注。
页面更新:2024-05-28
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号