int main(){
int i;
}
我在調用函數後在gdb中做了$ebp-$esp
,它給了我4.但是舊的ebp
呢?我能否認爲這個函數需要8個字節的堆棧?對於int
爲4個字節,對於舊的ebp
爲4個字節。函數需要多少個字節?
筆記記錄我建立它利用-mpreferred-stack-boundary=2 -march=i386
int main(){
int i;
}
我在調用函數後在gdb中做了$ebp-$esp
,它給了我4.但是舊的ebp
呢?我能否認爲這個函數需要8個字節的堆棧?對於int
爲4個字節,對於舊的ebp
爲4個字節。函數需要多少個字節?
筆記記錄我建立它利用-mpreferred-stack-boundary=2 -march=i386
完全取決於編譯器如何確定優化功能。一些優化編譯器可能會將這個函數構建爲「main: ret
」的行,導致它根本不使用堆棧空間。
保存爲返回地址,對不對? (我認爲返回地址在邏輯上位於被調用函數的框架中)。 – ninjalj
但是在堆棧中,我們是否認爲它在呼叫者的框架中,被呼叫者的框架是從推動舊ebo開始的? – user986424
假設你沒有進行優化編譯,你不會計算舊的ebp,因爲esp會在舊的ebp被壓入堆棧後被複制到ebp。我認爲你看到的是海灣合作委員會拯救ecx,儘管我不知道爲什麼它。
函數需要多少內存將完全取決於您正在使用的編譯器。這是使用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
什麼都不做。
但我認爲返回地址並不保存在被調用者的框架中。對 ? – user986424
@ user986424:我只是說明從調用到完成執行函數需要多少字節的內存。這就是爲什麼我用這種方式措辭,數你喜歡的方式。這並不包括在你進入'main'之前的所有其他內容,或者.text部分本身。 – AusCBloke
在反彙編器中查看它。 –
如果沒有完整的編譯器詳細信息,無法回答此問題。 –
一個體面的問題,但你爲什麼想知道? –