2016-11-15 69 views
0

我在crt.S文件中有一些RISC V程序集。将地址作为符号载入通用寄存器

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

j _init 

(即执行一个无条件跳转到_init),代码编译罚款和运行。

但是,如果使用这样的:

li a3, _init 

(即,负载通用寄存器A3具有整数值_init)的代码不能编译。如果我替换一个文字整数值(例如,0x80001958,其他所有内容相同,则当前值为_init)代码将进行编译。

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

+0

我问一个关于汇编语法和有人投票关闭它的问题,因为它“不关于编程”?难怪人们说这个网站会去看狗。 – adrianmcmenamin

+1

我对RISC-V并不熟悉,但我对其他汇编语言非常熟悉。您的程序是本地还是外部的_init标签?我试图找到有关'li'指令的文档,但在RISC-V ISA手册中找不到它明确定义的文档。你用什么语言参考书来学习RISC-V? – HeatfanJohn

+0

li是一个伪指令,它让汇编程序知道如何生成正确的代码来构建数字,然后将其加载到寄存器中(例如,做一个转换,加上或直接等等)。这非常方便! 我现在已经解决了几个小时后的问题 - 请参阅下面的答案。 – adrianmcmenamin

回答

2

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