C語言初始化——棧的初始化


是一種具有后進先出性質的數據組織方式,也就是說后存放的先取出,先存放的后取出。棧底是第一個進棧的數據所處的位置,棧頂是最后一個進棧的數據所處的位置。

1.滿棧與空棧

根據SP指針指向的位置,棧可以分為滿棧和空棧

滿棧:當堆棧指針SP總是指向最后壓入堆棧的數據。

 

空棧:當堆棧指針SP總是指向下一個將要放入數據的空位置。

 

2.升棧和降棧

根據SP指針移動的方向,棧可以分為升棧和降棧。

升棧:隨着數據的入棧,SP指針從低地址->高地址移動。

降棧:隨着數據的入棧,SP指針從高地址->低地址移動

 

ARM采用的是滿降棧

3.棧幀

就是一個函數所使用的那部分棧,所有函數的棧幀串起來就組成了一個完整的棧。

棧幀的兩個邊界分別由fp(r11)和sp(r13)來限定。

4.棧的作用

4.1 保存局部變量

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a;
 6 
 7     a++;
 8 
 9     return a;
10 }
stack1.c

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

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

vim dump

4.2 參數傳遞

 1 #include <stdio.h>
 2 
 3 
 4 void func1(int a,int b,int c,int d,int e,int f)
 5 {
 6     int k;
 7     k=e+f;
 8 }
 9 
10 int main()
11 {
12     func1(1,2,3,4,5,6);
13     return 0;
14 }
stack2.c

同上,可查看!

4.3 保存寄存器的值

 1 #include <stdio.h>
 2 
 3 void func2(int a,int b)
 4 {
 5     int k;
 6     k=a+b;
 7 }
 8 
 9 void func1(int a,int b)
10 {
11     int c;
12     func2(3,4);
13     c=a+b;
14 }
15 
16 int main()
17 {
18     func1(1,2);
19     return 0;
20 }
stack3.c

同上,可查看!

5.棧的初始化

1  init_stack:
2    ldr sp,=0x54000000                                                        
3    mov pc,lr
init_stack

6410內存的起始地址:0x50000000,內存大小設為64MB

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM