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はカウントされません。私はあなたが見ているものは、gccは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
は無視されていることです。したがって、返されるアドレスがcall
でプッシュされたスタック上には4バイト、ebp
を保持するためには4バイトが返されます。
あなたが期待するとして、あなたはそれがなっ-O1
コンパイルフラグでわずかな最適化を有効にした場合、:
0x08048394 <+0>: ret
スタックフレームの必要は全くありませんので、main
は何もしません。
しかし、私はリターンアドレスが着呼者のフレームに保存されていないと思います。右 ? – user986424
@ user986424:私は関数の実行を終了するために呼び出すときに、スタック上のメモリのバイト数を記述しています。だからこそ、私はそれを言葉で表し、あなたの好きなものを数えてください。これは 'main'や' .text 'セクション自体に到達する前に行われていることをすべて含んでいるわけではありません。 – AusCBloke
ディスアセンブラで見てください。 –
この質問は完全なコンパイラの詳細なしでは答えられません。 –
まともな質問ですが、なぜ知りたいですか? –