2011-12-02 148 views
1
int main(){ 
    int i; 
} 

我在調用函數後在gdb中做了$ebp-$esp,它給了我4.但是舊的ebp呢?我能否認爲這個函數需要8個字節的堆棧?對於int爲4個字節,對於舊的ebp爲4個字節。函數需要多少個字節?

筆記記錄我建立它利用-mpreferred-stack-boundary=2 -march=i386

+5

在反彙編器中查看它。 –

+0

如果沒有完整的編譯器詳細信息,無法回答此問題。 –

+1

一個體面的問題,但你爲什麼想知道? –

回答

1

完全取決於編譯器如何確定優化功能。一些優化編譯器可能會將這個函數構建爲「main: ret」的行,導致它根本不使用堆棧空間。

+0

保存爲返回地址,對不對? (我認爲返回地址在邏輯上位於被調用函數的框架中)。 – ninjalj

+0

但是在堆棧中,我們是否認爲它在呼叫者的框架中,被呼叫者的框架是從推動舊ebo開始的? – user986424

1

假設你沒有進行優化編譯,你不會計算舊的ebp,因爲esp會在舊的ebp被壓入堆棧後被複制到ebp。我認爲你看到的是海灣合作委員會拯救ecx,儘管我不知道爲什麼它。

0

函數需要多少內存將完全取決於您正在使用的編譯器。這是使用GCC 4.6.2編譯命令上面的代碼的反彙編:

gcc -mpreferred-stack-boundary=2 -march=i386 -m32 -o test test.c 

    0x08048394 <+0>: push ebp 
    0x08048395 <+1>: mov ebp,esp 
    0x08048397 <+3>: pop ebp 
    0x08048398 <+4>: ret 

什麼是相當明顯的是,i被忽略,因爲它根本不使用。因此,堆棧中有4個字節,用於返回地址call,另外4個用於保存ebp

正如你所期望,如果你啓用了輕微的優化與-O1編譯標誌就變成:

0x08048394 <+0>: ret 

既然沒有必要堆棧幀可言,main什麼都不做。

+0

但我認爲返回地址並不保存在被調用者的框架中。對 ? – user986424

+0

@ user986424:我只是說明從調用到完成執行函數需要多少字節的內存。這就是爲什麼我用這種方式措辭,數你喜歡的方式。這並不包括在你進入'main'之前的所有其他內容,或者.text部分本身。 – AusCBloke

相關問題