2011-12-02 17 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はカウントされません。私はあなたが見ているものは、gccは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は無視されていることです。したがって、返されるアドレスがcallでプッシュされたスタック上には4バイト、ebpを保持するためには4バイトが返されます。

あなたが期待するとして、あなたはそれがなっ-O1コンパイルフラグでわずかな最適化を有効にした場合、:

0x08048394 <+0>: ret 

スタックフレームの必要は全くありませんので、mainは何もしません。

+0

しかし、私はリターンアドレスが着呼者のフレームに保存されていないと思います。右 ? – user986424

+0

@ user986424:私は関数の実行を終了するために呼び出すときに、スタック上のメモリのバイト数を記述しています。だからこそ、私はそれを言葉で表し、あなたの好きなものを数えてください。これは 'main'や' .text 'セクション自体に到達する前に行われていることをすべて含んでいるわけではありません。 – AusCBloke

関連する問題