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

时间:2016-11-15 21:13:52

标签: c assembly gas riscv

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

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

j _init

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

但如果我这样使用它:

li a3, _init

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

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

1 个答案:

答案 0 :(得分:2)

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