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

Assembly 在自定义计算机上运行GCC编译代码。在程序集中找不到sp初始化,assembly,gcc,callstack,stack-pointer,riscv32,Assembly,Gcc,Callstack,Stack Pointer,Riscv32,我在自定义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:

我在自定义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

第节的分解。正文:
00010074 :
寄存器_fini():
10074:00000793 li a5,0
10078:00078863 beqz A510088
1007c:00010537 lui a0,0x10
10080:51050513 addi a0、A01296#10510
10084:4e80006f j 1056c
10088:00008067 ret
0001008c:
_开始():
1008c:00002197 auipc总成,0x2
10090:e1c18193附加总成,总成,-484#11ea8
10094:c3018513增补a0,总成,-976#11ad8
10098:c4c18613附加a2,总成,-948#11af4
1009c:40a60633子a2、a2、a0
100a0:00000593 li a1,0
100a4:270000ef日本航空公司,邮编10314
100a8:00000517 auipc a0,0x0
100ac:4c450513 addi a0、A01220#1056c
100b0:00050863 beqz A0100C0
100b4:00000517 auipc a0,0x0
100b8:45c50513 addi a0、A01116#10510
公元前100年:日本东北部4B000EF,1056c
100c0:1b8000ef日本航空公司,邮编10278
100c4:00012503 lw a0,0(sp)
100c8:00410593 addi a1,sp,4

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

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


对于初学者来说,尽管做一些超级简单的事情,闪烁led或者如果这是一个sim卡,只要用递增寄存器做一个循环,然后查看sim卡中的核心,看看它是否启动并进入循环(在你需要堆栈指针之前很久)。如果在带有加载程序的系统上,则uart可能已初始化,但加载程序不处理sp和bss/数据,那么您可以循环代码戳uart tx缓冲区,查看代码是否已启动,并在尝试更复杂的操作之前将工具整理好。

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

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


对于初学者来说,尽管做一些超级简单的事情,闪烁led或者如果这是一个sim卡,只要用递增寄存器做一个循环,然后查看sim卡中的核心,看看它是否启动并进入循环(在你需要堆栈指针之前很久)。如果在带有加载程序的系统上,则uart可能已初始化,但加载程序不处理sp和bss/数据,那么您可以循环代码戳uart tx缓冲区,查看代码已启动,并在尝试更复杂的操作之前将工具整理好。

在操作系统(如GNU/Linux)下,内核创建一个堆栈并初始化用户空间堆栈指针。在Linux下进入
\u start
时,堆栈指针指向
argc
,其上方是
argv[]
envp[]
。所以CRT的启动代码只能使用现有的堆栈。好的,谢谢,那么我必须在开始时添加一些启动代码,使其作为裸机应用程序eah运行。使用gcc-f重建;IIRC它首先不会链接通常的CRT启动代码,因为该代码假设一个操作系统。(libc也是如此,如果您静态链接标准libc而不是使用
-ffreestanding
)谢谢,它成功了,我从启动文件初始化了sp,并使用-ffreestanding编译了代码。并将两者传递给操作系统(如GNU/Linux)下的linkerUnder,内核创建一个堆栈并初始化用户空间堆栈指针。在Linux下进入
\u start
时,堆栈指针指向
argc
,其上方是
argv[]
envp[]
。所以CRT的启动代码只能使用现有的堆栈。好的,谢谢,那么我必须在开始时添加一些启动代码,使其作为裸机应用程序eah运行。使用gcc-f重建;IIRC它首先不会链接通常的CRT启动代码,因为该代码假设一个操作系统。(libc也是如此,