栈初始化

为什么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,这样不至于程序中出现为初始化的全局变量为 异常值

原文地址:https://www.cnblogs.com/qifei-liu/p/10186051.html