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

1.满栈与空栈

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

满栈:当堆栈指针SP总是指向最后压入堆栈的数据。

空栈:当堆栈指针SP总是指向下一个将要放入数据的空位置。

2.升栈和降栈

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

升栈:随着数据的入栈,SP指针从低地址->高地址移动。

降栈:随着数据的入栈,SP指针从高地址->低地址移动

 

ARM采用的是满降栈

3.栈帧

就是一个函数所使用的那部分栈,所有函数的栈帧串起来就组成了一个完整的栈。

栈帧的两个边界分别由fp(r11)和sp(r13)来限定。

4.栈的作用

4.1 保存局部变量

 #include <stdio.h>

 int main()
{
int a; a++; return a;
}

stack1.c

arm-linux-gcc -g stack1.c -o stack1

arm-linux-objdump -D -S stack1 >dump

vim dump

4.2 参数传递

 #include <stdio.h>

 void func1(int a,int b,int c,int d,int e,int f)
{
int k;
k=e+f;
} int main()
{
func1(,,,,,);
return ;
}

stack2.c

同上,可查看!

4.3 保存寄存器的值

 #include <stdio.h>

 void func2(int a,int b)
{
int k;
k=a+b;
} void func1(int a,int b)
{
int c;
func2(,);
c=a+b;
} int main()
{
func1(,);
return ;
}

stack3.c

同上,可查看!

5.栈的初始化

  init_stack:
ldr sp,=0x54000000
mov pc,lr

init_stack

6410内存的起始地址:0x50000000,内存大小设为64MB

C语言初始化——栈的初始化的更多相关文章

  1. c语言将2进制数转化为10进制数(栈的初始化,进栈,出栈)

    //c语言描述 将2进制转化为10进制 #include <stdio.h> #include <stdlib.h> #include <math.h> #defi ...

  2. c++描述将一个2进制数转化成10进制数(用到初始化栈,进栈,入栈)

    /* c++描述将2进制数转化成10进制数 问题,1.初始化栈后,用new,不知道delete是否要再写一个函数释放内存, 还是在哪里可以加上delete 2.如果栈满了,我要分配多点空间,我想的办法 ...

  3. Go语言goroutine调度器初始化(12)

    本文是<Go语言调度器源代码情景分析>系列的第12篇,也是第二章的第2小节. 本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调 ...

  4. C语言标记化结构初始化语法

    C语言标记化结构初始化语法 (designated initializer),而且还是一个ISO标准. #include <stdio.h> #include <stdlib.h&g ...

  5. C语言数组空间的初始化详解

    数组空间的初始化就是为每一个标签地址赋值.按照标签逐一处理.如果我们需要为每一个内存赋值,假如有一个int a[100];我们就需要用下标为100个int类型的空间赋值.这样的工作量是非常大的,我们就 ...

  6. Swift5 语言指南(十六) 初始化

    初始化是准备要使用的类,结构或枚举的实例的过程.此过程涉及为该实例上的每个存储属性设置初始值,并执行在新实例准备好使用之前所需的任何其他设置或初始化. 您可以通过定义实现这个初始化过程初始化,这就像特 ...

  7. C语言顺序栈实现

    /*数序栈*/ #include<stdio.h> #include<stdlib.h> #include<math.h> #define SElemType ch ...

  8. C语言描述栈的实现及操作(链表实现)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; / ...

  9. 【原创】c++拷贝初始化和直接初始化的底层区别

    说明:如果看不懂的童鞋,可以直接跳到最后看总结,再回头看上文内容,如有不对,请指出~ 环境:visual studio 2013(编译器优化关闭) 源代码 下面的源代码修改自http://blog.c ...

随机推荐

  1. Qt之WebKit学习之绘图

    void Serial::on_pushButton_clicked() { //scroll(4,0); flag_btn = true; // this->update(); //绘图绘在窗 ...

  2. What is a watch descriptor

    http://stackoverflow.com/questions/24342156/what-are-watch-descriptors-really-linux-inotify-subsyste ...

  3. Bower安装Bootstrap

    1.Bower简介 官网:https://bower.io/ Bower can manage components that contain HTML, CSS, JavaScript, fonts ...

  4. sphinx 增量索引 实现近实时更新

    一.sphinx增量索引的设置   数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少.例如.原来的数据有几百万条 ...

  5. 3、JS中的语句

    1.块语句 常用于组合0~多个语句:语法:{语句1;语句2……} *没有块级作用域:如:在for循环里面定义一个自增数 i,可以在for循环外取到它跳出循环时的值,而且for循环里面新定义的数据也能取 ...

  6. 传智播客JavaWeb day03

    ServletContext 这堂课主要讲ServletContext这个web域(可以看得见范围的)对象,web在启动的时候会创建唯一的ServletContext域对象. 作用:1.用来web域共 ...

  7. VS2010 刷新工具箱(刷新自定义控件)

    有时候自己自定义了控件,定义完后却不见工具箱中刷新出来自定义的控件,解决方案有了三种: 点评:在项目中增加了几个自定义控件,想在窗口上添加时却发现工具箱根本就没有些控件,晕了.记得2008都可以自动出 ...

  8. iOS-Git 所有资料

    查看git所有资料参考这个网站:http://git.oschina.net/progit/

  9. raw_input 和input的区别

    input它会根据用户输入变换相应的类型, raw_input则是不管用户输入什么类型的都会转变成字符型.

  10. Linux TC流量控制HOWTO中文版

    <本文摘自Linux的高级路由和流量控制HOWTO中文版 第9章节>网人郭工进行再次编译: 利用队列,我们可以控制数据发送的方式.记住我们只能对发送数据进行控制(或称为整形).其实,我们无 ...