函數的調用原理——棧楨

函數調用過程------棧楨ide

例:剖析「比較兩個數之間的大小關係,並把較大數返回」的調用原理函數

int Max(int x, int y)
{
                 int z = 0;
                 if (x > y)
                                z = x;
                 else
                                z = y;
                 return z;
}
int main()
{
                 int a = 10;
                 int b = 20;
                 int c = 0;
                c = Max(a, b);
                printf( "%d\n", c);
                system( "pause");
                 return 0;
}

分析:url


圖一:spa

main函數是被mainCRTStartup調用的,因此main函數棧楨的ebp+1存放的是mainCRTStartup棧楨ebp:3d

wKiom1cT6U7Sl1MRAABNCoZb8NY211.png

spacer.gif

觀察上圖mainCRTStartup 的esp=0018ff4c     ebp=0018ff88orm


圖二:blog

下面這幅圖是mainCRTStartup調用main的過程,以及main函數棧楨的建立:內存

spacer.gifwKiom1cT6XajooTEAAHuOLXFPe0636.png

圖二:get

這幅圖是Max函數棧楨的建立過程:編譯器

wKioL1cT6oywmVssAAEjx1svjJw322.png

spacer.gif

圖三:

這幅圖是Max函數調用完成後,Max棧楨的銷燬過程:

wKiom1cT6ebDKUt3AAJWnw5NHrs266.png


spacer.gif

整個程序在執行的過程當中,函數的棧楨能夠抽象以下圖,注意,棧是由高地址向低地址走的:

spacer.gifwKiom1cT6frgjWARAAA4hPlzAEY107.png

由於棧要對齊,因此編譯器分配的內存若是多了,則就會被浪費。

相關文章
相關標籤/搜索