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