【问题标题】:RISC-V assembly on GCC - Why is a redundant mv command being generated?GCC 上的 RISC-V 程序集 - 为什么会生成冗余 mv 命令?
【发布时间】:2021-11-09 09:33:29
【问题描述】:

我有以下几行

la x14, L2
sw x13, 0(x14)

其中L2的地址是0x2018

当我生成 ELF 文件并使用 objdump 检查它时,我看到的是(仅相关部分):

...
1018: auipc   a4,0x1
101c: mv      a4,a4
1020: sw      a3,0(a4) # 2018 <L2>
...

1018 处的行,即mv a4 a4 转换为addi a4, a4, 0,这是多余的。为什么会产生这个?如果没有这条线,它仍然可以工作吗?

gcc 是否要求始终为 la 指令生成 2 条指令?

【问题讨论】:

    标签: riscv riscv32


    【解决方案1】:

    la 是 RISC-V 的伪命令。

    例如,参见RISC-V assemly language programming 一书的第 4.10.2 章“伪指令”。

    【讨论】:

    • 谢谢,是的,但是生成mv a4, a4 需要什么?这与nop 基本相同。
    • mv a4, a4addi a4, a4, 0 相同。在您的情况下,有一个指向它的重定位,以便链接器可以将 0 替换为合适的值。如果该值保持为零,则删除该指令。此过程称为链接器松弛
    猜你喜欢
    • 2020-01-01
    • 1970-01-01
    • 2012-05-26
    • 2012-09-02
    • 2014-12-10
    • 2018-05-13
    • 1970-01-01
    • 2022-12-06
    • 2017-04-29
    相关资源
    最近更新 更多