このコードを見てください私はcプログラムの単純な部分を逆アセンブルし、gccを使って32ビットモードでコンパイルしました。 ご覧のとおり、コンパイラはESPで8を引いた後、0xCを減算します。プッシュは、ESPで4バイトを減算しています。したがって、printf呼び出しの前に、スタックに24バイトが割り当てられています。なぜコンパイラはESPで値を減算するのです
0x0804846e <+3>: sub esp,0x8
0x08048471 <+6>: sub esp,0xc
0x08048474 <+9>: push 0x8048550
0x08048479 <+14>: call 0x8048330 <[email protected]>
0x0804847e <+19>: add esp,0x10
しかし、printf呼び出しを見れば、コンパイラは16バイトしか追加しません。だから私はリークがあると思いますか?
私はアセンブラで自分で書きたい場合は、私が書くでしょう:
0x08048474 <+9>: push 0x8048550
0x08048479 <+14>: call 0x8048330 <[email protected]>
0x0804847e <+19>: add esp,0x4
は、あなたは私が間違っていると思いますか?ローカル変数がない場合、sub espでスタックにデータを割り当てる目的は何ですか?
スタックポインタが正しい値に復元されているかどうかを確認するのは簡単です。この関数が返った後、呼び出し元のように実行を続行しますか?そうであれば、戻りアドレスが見つかりました。スタックポインタが間違っていれば、リターンアドレスはほとんど見付かりません。 – hvd