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