连接链接描述文件与汇编文件 [risc-v]

Connecting linker script with assembly file [risc-v]

我正在使用 RISC-V compiler,我需要将我的链接描述文件“变量”连接到汇编文件指令,例如:

在我的链接描述文件 (.ld) 中有这一行:

ENTRY(_start)
_estack = 0x1FFFC;    /* end of RAM */
...

据此,我需要在我的 start.S 文件中创建一个汇编指令,如下所示:

li sp, _estack

我试过很多东西,比如:

.word _estack
# - or -
.global _estack

li sp, _estack

但是其中 none 似乎有效,并且显示了这条消息:

App/src/start.S: Assembler messages:
App/src/start.S:59: Error: illegal operands `li sp,_estack'
make: *** [build/start.o] Error 1

关于上下文,这是我的 start.S 文件:

.global _start

.section .text.prologue, "ax"

.word _estack
# .global _estack


_start:
    li sp, _estack
    jal  ra, main
    j _exit

_exit:  j _exit

这是“试试看”的事情之一。

extern unsigned int _estack;
unsigned int fun ( void  )
{
    return(_estack);
}

假设 gcc 检查编译器输出

fun:
    lui a5,%hi(_estack)
    lw  a0,%lo(_estack)(a5)
    ret

所以,对于 gnu 汇编程序(汇编语言特定于工具而不是目标)

lui x15,%hi(_estack)
lw  sp,%lo(_estack)(x15)

_estack = 0x1FFFC;
MEMORY
{
    ram : ORIGIN = 0x00000000, LENGTH = 0x1000
}
SECTIONS
{
    .text : { *(.text*) } > ram
}

Disassembly of section .text:

00000000 <.text>:
   0:   000207b7            lui x15,0x20
   4:   ffc7a103            lw  x2,-4(x15) # 1fffc <_estack>

这也应该有效:

lui sp,%hi(_estack)
addi sp,sp,%lo(_estack)

还有ori。

就像任何其他常量一样,您需要从 lui 开始设置高位,然后您可以在其他指令中处理低位。汇编程序可能有一个伪指令,用于选择解决方案(例如,如果常量为 0x12340000,则您只需要 lui)。但是假设伪指令特定于汇编器而不是目标。

在您的 crt0 文件中,您需要将:li sp, _estack 替换为 la sp, _estackli 仅用于立即数,因为 _estack 是您必须使用的符号 la.

在你的链接描述文件中你需要提供符号,否则你会得到一个未定义的引用错误。替换
_estack = 0x1FFFC; /* end of RAM */
通过 PROVIDE(_estack = 0x1FFFC); /* end of RAM */.