问题描述
在尝试在自定义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缓冲区,并查看代码已启动并获取您的工具。在尝试更复杂的东西之前先订购。