2017-05-07 19 views
4

C関数を使用している間、アセンブリで小さなプログラムを作成するように求められました。そうしている間、私は何か特定のものについて疑問を抱いていました。アセンブリからC関数 "exit"を呼び出すときにスタックをクリーニングする必要はありますか?

私はアセンブリを扱うとき、私はC関数を呼び出したいところはどこでも、私はスタックにそれの引数をプッシュしなければならないことを知って、そして関数が返された後、私はそれらの引数をポップ(またはespに4 × Xを追加する必要がありますここで、xはプッシュされた引数の数を表します)。特にCの関数を呼び出すときexit 、私は最初の状態のための引数をプッシュする必要があります。

私の質問はこれです。私のプログラムがエラーなしで動いたことを示すために0を押したいとしましょう。

exit関数が返ってこないことを知っていて、それを使用しなければならず、exitシステムを自分自身で中断することはできません。どうすればこのスタックで0をポップできますか? exit機能はそれを私のために実行しますか?

答えて

1

あなたはそうする必要はありません。 exit()が返されず、プログラムが終了すると、スタックを含めて、使用したすべてのメモリの割り当てが解除されます。

exitが返されないことをコンパイラが認識していないため、コンパイラはスタックをクリーンアップするためにadd esp, 4を生成します。

+0

標準ライブラリの 'exit'関数に適切にアノテートされていなければ、オプティマイザに返されないことを通知します。 MSVC、GCC、ICCのいずれも、このような余分なスタッククリーンアップ命令を発行しません。 :-) –

+0

ありがとうコーディー、良いコメント。 –

+0

私も同様に考えていたが、確かめたかったありがとうございます。 – PeNpeL

関連する問題