函数调用堆栈
基于孟寧老師的Linux內核分析
1 int g(int x){ 2 int y = x + 3;3 return y;4 }5 6 int f(int x){7 int z = x + 10;8 return g(z);9 }10 11 int main(){12 int a = f(8) + 1;13 return 0;14 }對于上述源代碼,我們嘗試對其進行分析,先編譯gcc -g -o lab1 lab1.c(注意計算機系統是32位Linux)。
堆棧能夠干什么
對于C語言來說,32位下,堆棧都能干什么?
call指令,能夠讓EIP入棧,ret指令讓EIP出棧
另外,函數的返回值,會被保存到EAX中,可能是值,也可能是地址(如果是地址,地址對應的空間就不能是會被銷毀的棧空間,需要是堆空間,或者是暫時不會被銷毀的棧空間)。
指針和引用也可以傳遞返回值,他們是作為參數傳過來的,修改指針指向地址的值,就相當于是傳參了。
關于棧空間的構建與撤銷,其實就兩個重要節點
存儲2個局部變量:
總結
- 上一篇: 精子少可以受孕吗
- 下一篇: gdb调试的几点提示(1)