在自定义机器上运行GCC编译的代码在程序集中找不到sp初始化

问题描述

在尝试在自定义rv32I机器上运行gcc编译的代码时,我正在经历.lst。我找不到sp的初始值


disassembly of section .text:

00010074 <register_fini>:
register_fini():
   10074:   00000793            li  a5,0
   10078:   00078863            beqz    a5,10088 <register_fini+0x14>
   1007c:   00010537            lui a0,0x10
   10080:   51050513            addi    a0,a0,1296 # 10510 <__libc_fini_array>
   10084:   4e80006f            j   1056c <atexit>
   10088:   00008067            ret

0001008c <_start>:
_start():
   1008c:   00002197            auipc   gp,0x2
   10090:   e1c18193            addi    gp,gp,-484 # 11ea8 <__global_pointer$>
   10094:   c3018513            addi    a0,-976 # 11ad8 <completed.1>
   10098:   c4c18613            addi    a2,-948 # 11af4 <__BSS_END__>
   1009c:   40a60633            sub a2,a2,a0
   100a0:   00000593            li  a1,0
   100a4:   270000ef            jal ra,10314 <memset>
   100a8:   00000517            auipc   a0,0x0
   100ac:   4c450513            addi    a0,1220 # 1056c <atexit>
   100b0:   00050863            beqz    a0,100c0 <_start+0x34>
   100b4:   00000517            auipc   a0,0x0
   100b8:   45c50513            addi    a0,1116 # 10510 <__libc_fini_array>
   100bc:   4b0000ef            jal ra,1056c <atexit>
   100c0:   1b8000ef            jal ra,10278 <__libc_init_array>
   100c4:   00012503            lw  a0,0(sp)
   100c8:   00410593            addi    a1,sp,4

解决方法

如果要滚动自己的裸机或不裸机,则至少需要解决堆栈指针,.data和.bss初始化。如果要使用此代码引导处理器,则还需要解决该处理器的vector / exception / boot解决方案。如果您不启动处理器,则可以选择将堆栈和data / bss初始化滚动到应用程序的加载器中,也可以将其放入应用程序中。然后,您实质上需要一种操作系统使用的文件格式,以告知加载程序所有内容/去向以及指令/数据本身。

通常,如果使用裸机,则您有自己的引导程序和链接程序脚本(他们是一对已婚夫妇)来启动特定目标的代码(不仅是isa,而且是芯片/加载器/任何系统/环境)。如果您想使用C库,那么您还有很多工作要做,因为C库在很大程度上依赖于系统,因此您必须创建或伪造一个操作系统来处理所有系统调用(或者只是不支持C库,让生活更幸福。

对于初学者,尽管可以使超级简单,但要使LED闪烁,或者如果这是一个sim卡,则只需使用递增寄存器进行循环,然后查看sim卡的内核以查看其启动并进入了循环(很久以前您需要一个堆栈指针)。如果在具有加载程序的系统上,则可能初始化了uart,但加载程序无法处理sp和bss / data,那么您可以循环代码戳入uart tx缓冲区,并查看代码已启动并获取您的工具。在尝试更复杂的东西之前先订购。