分支和跳转中的地址



在MIPS中,为了在分支的情况下计算新指令的地址,将偏移量(移位的16位(添加到当前PC。但为了在跳跃的情况下算出新指令的位置,将用跳跃后的新26位替换当前PC。用新的价值取代PC的整个价值背后的逻辑是什么?在分支的情况下,我们为什么只计算新地址?

有关如何计算跳转目标地址和分支目标地址的详细信息,请参阅此链接"如何计算跳转目的地地址和分支目的地地址?"?

动机如下所示:

26位的pc相对分支可以达到+/-128MB,这是256MB的范围。对于位于代码段中间的代码,它可以到达该范围内的任何位置。然而,靠近开头或结尾的代码只能达到该代码段的128MB——开头的代码可以达到+128MB,靠近结尾的代码可以到达-128MB,因此对他们来说,一半的范围是"0";浪费";。因此,无需担心或缓解的最大代码段为128MB。

通过使用更绝对的概念,所有代码——无论是在代码段的开头、中间还是结尾附近——都可以达到256MB的完整范围。


这种方法的缺点是,代码段实际上需要从256MB的边界开始(即,没有严重复杂的链接(,从而将代码段的总数限制为16。

相反,使用大的pc相对位移会将代码段的大小限制在约128MB,这仍然是巨大的,并且会消除代码段计数的限制,因为所有代码都是pc相对的。

RISC V已经废除了这种方法,取而代之的是pc相对寻址——尽管1条指令中的最大位移小于21位,这意味着当代码段大于1MB时,1条指令的调用模型可能会失败;下一个模型使用2条指令(AUIPC和JALR(来执行32位范围(即+/-2GB(的pc相关分支/调用。

RISC V工具链还支持";放松";,这意味着,当实际位移允许时,链接器可以缩短多个指令分支或数据引用序列(使编译器甚至为内部分支和标签delta提供修正,因为生成的代码的大小可能会在内部发生变化!(。


我会看看是否能找到一些参考,尽管逻辑似乎有意义。


From";MIPS®编程器体系结构第II-A卷:MIPS32®指令集,修订版5.04";,第142页(J指令;第143页日航指令(。

编程说明:
通过链接PC和索引位而不是向PC添加带符号偏移量来形成分支目标地址是如果所有程序代码地址都适合在256MB边界上对齐的256MB区域,则具有优势。它允许分支从区域中的任意位置到区域中的任何位置,一个带符号的相对偏移不允许的操作。

最新更新