博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
栈初始化
阅读量:4286 次
发布时间:2019-05-27

本文共 899 字,大约阅读时间需要 2 分钟。

bootloader中即用到汇编语言,也用到c语言

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

栈初始化

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

这里写图片描述

根据SP指针指向的位置,栈可以分为满栈和空栈。

1.满栈:堆栈指针SP总是指向最后压入堆栈的数据
2.空栈:堆栈指针SP总是指向下一个将要放入数据的空位置

这里写图片描述

满栈

这里写图片描述

空栈

ARM采用满栈!

根据SP指针移动的方向,栈可以分为升栈和降栈。

1.升栈:随着数据的入栈,SP指针从低地址->高地址移动
2.降栈:随着数据的入栈,SP指针从高地址->低地址移动
ARM采用降栈!

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

这里写图片描述

当调用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)

你可能感兴趣的文章
支持向量机(理论+opencv实现)
查看>>
K-means算法(理论+opencv实现)
查看>>
高斯混合模型(理论+opencv实现)
查看>>
VS2015+Python3.5的配置
查看>>
分水岭算法(理论+opencv实现)
查看>>
《图像处理实例》 之 精确寻找一个圆
查看>>
opencv3.1+contrib的配置大总结(配置了两天,遇到问题无数)
查看>>
opencv小问题大智慧
查看>>
《图像处理实例》 之 车牌定位
查看>>
《opencv学习》 之 OTSU算法实现二值化
查看>>
《图像处理实例》 之 答题卡检测
查看>>
图像矩的初步探索(第十一天)
查看>>
《电路学习第一天》 之 电路设计之前的准备
查看>>
《电路学习第三天》 之 线性稳压电源的设计
查看>>
《图像处理实例》 之 目标旋转矫正(基于区域提取、DFT变换)
查看>>
不规则ROI的提取
查看>>
《图像处理实例》 之 提取特殊背景的直线
查看>>
《电路学习第三天》 之 彩扩机项目设计
查看>>
《图像处理实例》 之 物体计数
查看>>
《图像处理实例》 之 透视变换
查看>>