gdb調試的時候會出現esp和ebp這兩個指針,而這兩個指針為我們查看棧的情況提供了方便。
簡單點說,esp指向棧頂,而ebp指向棧底。例如一段程序:

1 #include <stdio.h> 2 3 int layout(int a){ 4 int b = a + 5; 5 return b; 6 } 7 8 int main(void){ 9 int a = 5; 10 layout(5); 11 12 return 0; 13 }
執行過程中esp和ebp的狀態如下:
這時執行main函數中調用layout之前的棧的狀態。調用layout時棧的狀態如下:
所以,esp和ebp指向當前執行函數的棧頂和棧底,這也是每次調用函數時我們需要保存ebp的原因。esp不用保存,A調用B時,A的棧頂就是B的棧底。