gpt4 book ai didi

riscv - RISC-V 中 JAL 和 JALR 指令的偏移地址

转载 作者:行者123 更新时间:2023-12-03 14:32:46 25 4
gpt4 key购买 nike

在 RISC-V 规范中,写到 JAL 和 JALR 指令中的立即数被转换为跳转偏移量:

  • 将给定的立即数符号扩展到 XLEN 位。
  • 将 LSB 设置为零。

  • 关于这个,我有几个问题。

    问题 1

    对于 JAL,这给出了一个范围:
    000000000000 to 111111111110

    也就是说,4KiB。

    在这里,如果 LSB 必须始终为零,为什么不将立即数视为地址的强制零 LSB 之前的 12 位,从而将地址范围增加到:
    [000000000000]0 to [111111111111]0      

    [ ] 表示给定的立即数偏移量,内部在给定的立即数偏移量的末尾添加一个零。那是,
  • 左移一点点给出地址。
  • 将结果符号扩展到 XLEN 位。

  • 问题 2

    如何区分正偏移和负偏移?是否使用了给定偏移量的 MSB?

    最佳答案

    JAL有一个 20 位的偏移量和一个寄存器作为操作数。

    它的操作是pc := pc + sxt ( imm20 << 1 ) .

    从公式可以看出,分支是相对于 pc 的。立即数可以从 JAL 达到 +/- 1 MB本身。立即数移位一位,真正的 LSB 始终为零,因此不进行编码。

    因为 RISC V 支持 16 位(两个字节)倍数的指令,所以我们不能假设下一个 LSB 也是零,就像 MIPS(具有 32 位指令)一样。
    JAL中的寄存器操作数除了执行分支之外,还可以选择用于捕获返回地址。
    JAL的功能是使用其 20 位范围执行适度远的 pc 相对分支或调用。 (与在 +/- 4 KB 范围内只有 12 位的 RISC V 条件分支指令形成对比。)
    JALR有一个 12 位的偏移量和两个寄存器作为操作数。

    它的操作是pc := ( rs1 + sxt ( imm12 ) ) & -2 .

    从公式可以看出,分支是寄存器间接的,相对于 rs1 中的值.

    JAL , JALR还可以捕获返回地址。
    JALR用于从函数返回(在汇编中又名 RET。在这种形式中,$ra 用作源寄存器,不捕获返回地址)。这使用零作为偏移量(即不需要偏移量)。
    JALR也用于执行间接函数调用:通过函数指针调用、虚拟方法调度等。这些使用也使用零作为偏移量。
    JALR也可与AUIPC依次使用.
    AUIPC有一个 20 位的偏移量和一个寄存器作为操作数。

    它的操作是rd := pc + ( imm20 << 12 ) .

    它计算相对于 pc 的立即数的上半部分(同时还提供非相对的 pc 的下半部分)。

    结合JALR ,这可以完成 32 位 pc 相关的分支或调用。

    AUIPC r5, labelFarAway      # AUIPC encodes upper 20 bits of label's distance from pc
    JALR r5, $ra, labelFarAway # JALR encodes the lower 12 bits of same

    关于riscv - RISC-V 中 JAL 和 JALR 指令的偏移地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59150608/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com