我在crt.S
文件中有一些RISC V程序集。
如果我像这样使用C函数_init
的名称:
j _init
(即执行无条件跳转到_init
),代码编译好并运行。
但如果我这样使用它:
li a3, _init
(即,使用整数值A3
加载通用寄存器_init
)代码将无法编译。如果我替换一个文字整数值(例如,0x80001958
,其他所有条件相同,当前值为_init
),则代码将被编译。
我在这里做错了什么? (这是使用GNU GCC / AS)
答案 0 :(得分:2)
答案是 - 由于RISCV支持各种各样的地址格式 - 我不能使用li
,因此假设地址格式与寄存器格式大小相同。相反,我必须使用la
来加载适当扩展到地址格式的数字,而不是整数寄存器格式。