原文:https://manybutfinite.com/post/journey-to-the-stack/
翻譯:RobotCode俱樂部
現在讓我們來看看函數棧楨的誕生,以便在腦海中清晰地勾勒出它們是如何一起工作的。棧楨的增長一開始令人困惑,因為它發生在與你預期相反的方向。例如,要在棧上分配8個位元組,就要從esp中減去8,而減法是一種奇怪的增長方式。
Simple Add Program - add.c
int add(int a, int b)
{
int result = a + b;
return result;
}
int main(int argc)
{
int answer;
answer = add(40, 2);
}
假設我們在沒有命令行參數的Linux中運行以上程序。當你運行一個C程序時,第一個實際執行的代碼是在C runtime庫中,然後它調用我們的main函數。下面的圖一步一步地展示了程序運行時的情況。每個圖鏈接到顯示內存和寄存器狀態的GDB輸出。你還可以看到所使用的GDB命令和整個GDB輸出。我們開始吧: