• 栈初始化


    为什么C语言需要栈

    1.概念解析

          1.1 栈

             (1)栈后进先出

                 栈顶

                 SP

                 栈底

          1.2 空/满栈

                 SP指向的地址已经被占了,是满栈

                 SP指向的位置是空的,叫空栈

                 ARM使用的是满栈

          1.3 升/降栈

                移动的方向来确定是升栈还是降栈

                 从 低向高 叫升栈

                从高到低 叫降栈

             ARM 采用降栈

           1.4 栈帧(stack frame)

                    一个进程会用到一个栈

                    一个函数会分割栈区域的一个地方,这个地方就叫做栈帧

                  如何来界定栈帧之间的边界

                   上边界 由 FP指针  R11寄存器

                   下边界 由 SP指针 R13 寄存器

            C语言中 main 函数的上边界 和下边界在哪里呢?

                   答:被它所调用的函数的 栈帧里面的 SP 和 FP变量

            

    2.栈作用(栈在C语言中的应用)

         2.1 保存局部变量

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

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

                   查看 dump文件理解 C语言局部变量

                   

         2.2 参数传递

           main->func1(1,2,3,4,5,6) 前4个用寄存器保存,后面的用栈保存

         2.3 保存寄存器值

    main-> func1-> func2

    3.栈初始化编程

    统一把 SP指针放到 64M位置

    2440 是 256M  0x3000000 + 64M = 0x34000000

    初始化 bss 段

    1.bss段的作用

    初始化的全局变量 存放在 数据段

    局部变量 /未初始化的局部变量 存储在 栈里面

    未初始化的  全局变量 (两个条件必须都满足)  存放在bss段里面

    希望从bss段里面的取的值都是0,这样不至于程序中出现为初始化的全局变量为 异常值

  • 相关阅读:
    线程同步——用户模式下线程同步——Slim读写锁实现线程同步
    线程同步——用户模式下线程同步——关键段实现线程同步
    线程同步——用户模式下线程同步——Interlocked实现线程同步
    创建线程
    GDI的 点 线 面 双缓冲 位图的绘制
    简单的windows窗口创建实例
    宽字符与多字符
    学习MFC的建议
    DataGrip 2018.3.1破解激活码
    mysql 主从复制配置
  • 原文地址:https://www.cnblogs.com/qifei-liu/p/10186051.html
Copyright © 2020-2023  润新知