2016-06-30 7 views
1

このコードを見てください私は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でスタックにデータを割り当てる目的は何ですか?

+0

スタックポインタが正しい値に復元されているかどうかを確認するのは簡単です。この関数が返った後、呼び出し元のように実行を続行しますか?そうであれば、戻りアドレスが見つかりました。スタックポインタが間違っていれば、リターンアドレスはほとんど見付かりません。 – hvd

答えて

1

ローカル変数がない場合、sub espを使用してスタックにデータを割り当てる目的は何ですか?

スタックアライメント:GCCは、呼び出されたルーチンがアライメントを必要とするSSE2命令を使用するかどうかを知りませんので、ルーチン内でスタックを16バイトに整列させたままにします。

私はほとんどの場合ありません漏れ

があると思います。しかし、あなたは分解全体を表示していないので、伝えるのは不可能です。

関連する問題