将地址作为符号加载到通用寄存器中

Loading an address, as a symbol, into a general register

我在 crt.S 文件中有一些 RISC V 程序集。

如果我像这样使用 C 函数的名称 _init

j _init

(即执行无条件跳转到 _init),代码编译正常并运行。

但是如果我这样使用它:

li a3, _init

(即,用整数值 _init 加载通用寄存器 A3)代码将无法编译。如果我替换一个文字整数值(例如,0x80001958,在所有其他条件相同的情况下,当前是 _init 的值)代码编译。

我在这里做错了什么? (这是使用 GNU GCC/AS)

答案是——由于 RISCV 支持多种地址格式——我不能使用 li,因此假设地址格式与寄存器格式大小相同。相反,我必须使用 la 加载适当扩展为地址格式而不是整数寄存器格式的数字。