棧初始化

爲何C語言須要棧linux

1.概念解析編程

      1.1 棧函數

         (1)棧後進先出指針

             棧頂blog

             SP進程

             棧底變量

      1.2 空/滿棧gcc

             SP指向的地址已經被佔了,是滿棧gc

             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,這樣不至於程序中出現爲初始化的全局變量爲 異常值

相關文章
相關標籤/搜索