0

我在尝试在我的自定义 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,gp,-976 # 11ad8 <completed.1>
   10098:   c4c18613            addi    a2,gp,-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,a0,1220 # 1056c <atexit>
   100b0:   00050863            beqz    a0,100c0 <_start+0x34>
   100b4:   00000517            auipc   a0,0x0
   100b8:   45c50513            addi    a0,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
4

1 回答 1

2

如果您自己滚动,无论是否裸机,您都需要至少解决堆栈指针、.data 和 .bss 初始化。如果您使用此代码启动处理器,您还需要解决该处理器的向量/异常/启动解决方案。如果您没有启动处理器,那么您可以选择将堆栈和数据/bss init 滚动到应用程序的加载程序中,或者您可以将其放入应用程序中。然后,您基本上需要一种操作系统使用的文件格式,以告诉加载程序一切都在哪里/在哪里以及指令/数据本身。

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

对于初学者来说,虽然做一些超级简单的事情,让 LED 闪烁,或者如果这是一个 sim 卡,只需用一个递增寄存器创建一个循环,然后查看 sim 卡中的核心,看看它是否已启动并进入循环(早在你需要一个堆栈指针)。如果在带有加载器的系统上,那么也许 uart 已初始化,但加载器不处理 sp 和 bss/data,那么您可以循环代码以戳 uart tx 缓冲区并查看代码已启动并获取您的工具在尝试更复杂的东西之前先订购。

于 2020-09-05T16:50:15.403 回答