bootloader中即用到汇编语言,也用到c语言
汇编语言:核心初始化
c语言:完成板载硬件的初始化
要使用c语言,首先要初始化c语言编程环境,包括栈初始化和bss段初始化。

栈初始化
栈是一种具有后进先出性质的数据组织方式,也就是说后存放的先取出,先存放的后取出。栈底是第一个进栈的数据所处的位置,栈顶是最后一个进栈的数据所处的位置。

初始化一个顺序栈Java 如何初始化一个栈_数据

根据SP指针指向的位置,栈可以分为满栈和空栈。
1.满栈:堆栈指针SP总是指向最后压入堆栈的数据
2.空栈:堆栈指针SP总是指向下一个将要放入数据的空位置

初始化一个顺序栈Java 如何初始化一个栈_初始化_02


满栈

初始化一个顺序栈Java 如何初始化一个栈_数据_03


空栈

ARM采用满栈!

根据SP指针移动的方向,栈可以分为升栈和降栈。
1.升栈:随着数据的入栈,SP指针从低地址->高地址移动
2.降栈:随着数据的入栈,SP指针从高地址->低地址移动
ARM采用降栈!

栈帧(stack frame):一个进程会使用一个栈,一个进程会有多个函数,而每个函数又会占据栈的一部分。每一个函数所使用的那部分栈就称为栈帧。所有函数的栈帧串起来就组成了一个完整的栈。栈帧的两个边界分别由fp(r11)和sp(r13)来限定。

初始化一个顺序栈Java 如何初始化一个栈_c语言_04

当调用func1时,fp和sp分别指向func1的上边界和下边界。调用func1的main函数的上边界和下边界的地址保存在main函数所调用的func1函数的栈帧里。由上图可知,func1栈帧中的sp存放的是main函数的下边界,fp存放的是main函数的上边界。

栈作用有三点:
1.保存局部变量
2.传递函数参数
在c语言传递参数过程中,如果一个函数要传递的参数少于或者等于4个时,就采用r0,r1,r2,r3这4个寄存器来传递;当要传递的参数多于4个时,多出来的参数保存在栈来传递。
3.保存寄存器的值

汇编语言初始化栈:
栈的初始化较简单,只需要初始化sp的值,因此只需一条汇编指令

init_stack:
    ldr sp, =0x34000000

(2440的内存起始地址为0x30000000,现在分给该进程的栈64MB的空间,64MB占用的地址数为0x4000000,加上起始地址0x30000000,为0x34000000)