RISCV-与PC相对的跳转指令?

问题描述 投票:0回答:1

在RISC-V非特权规范V20191213中,声明如下,(第21页)

无条件跳转指令全部使用PC相对寻址来帮助支持与位置无关的代码。

查看JALR指令的定义,

间接跳转指令JALR(跳转和链接寄存器)使用I型编码。目标通过将符号扩展的12位I-immediate加到寄存器rs1中,然后设置来获得地址结果的最低有效位为零。

此地址计算显然是不是与PC相关。那么,为什么规范要求所有跳转指令都使用PC相对寻址呢?

而且,相对于PC的寻址如何支持位置-独立代码?难道不是完全相反吗?

architecture cpu riscv isa
1个回答
0
投票

此地址计算显然与PC无关。那么,为什么规范要求所有跳转指令都使用PC相对寻址呢?

是的,您是正确的。您必须欣赏JALR的一些不同用法:

  1. 返回子程序,
  2. 进行间接函数调用,
  3. 进行远程(+/- 2GB)函数调用

前两个根本不需要任何偏移,因为所需的地址已在寄存器中完全指定,因此没有相对于PC的问题。

[最后一个使用2指令序列,第一个是AUIPC,这使该序列与pc相对。

而且,相对于PC的寻址如何支持与位置无关的代码?难道不是完全相反吗?

PC相对意味着,代码可以加载到内存中的任何位置,并且仍然可以运行,也就是说,代码可以找到代码的其他部分,而无需更改代码块所在的初始地址。已加载(或者,如果在ROM中,它将出现在地址空间中)。

具有引用代码的指针的数据,根据加载代码的最终位置,必须为relocated (adjusted)

(当然,位置无关并不意味着代码一旦开始执行就可以移动!一旦开始执行,数据结构将捕获代码地址,因此代码必须固定在选择加载的位置。位置无关表示独立于加载时间位置。)

因此,可以将子例程调用中的返回地址捕获为直接/绝对指针值,在将其用于从子例程返回之前(例如,可以将其保存或不保存到堆栈帧中)。使用JALR

在这种情况下,即使返回地址是绝对指针值,它在运行时从调用方的(固定)位置动态捕获,因此不会违反位置独立性。

(您不希望通过JALR进行的返回操作是pc相关的,因为JALR的pc地址在返回被调用方的末尾与调用方中的返回链接位置无关。重要的是捕获相对于调用该子例程的JAL的返回地址。)

© www.soinside.com 2019 - 2024. All rights reserved.