2011-08-08 4 views
4

スタックフレーム内の関数の戻り値をプッシュすることが理にかなっているのでしょうか。スタックフレーム内の戻り値をプッシュ

戻り値はほとんどがレジスタに格納されていることがわかりますが(gaxの場合はeax)、パフォーマンスのみですか?

ありがとうございます!

答えて

9

これは意味がありますが、手動で挿入する必要があります(単純なプッシュではありません)。関数の戻り値がスタックの一番上になければならないので、戻り値は次のようになるはずです:呼び出し側が関数を呼び出す前にspを減らす必要があります。リターンアドレス以下。 [スタック上の引数を渡すのと同じ原理]

+0

明確な説明をいただきありがとうございます。 この場合、呼び出し側は戻り値を(必要に応じて)いくつかの変数に代入し、ポップしてパラメータをポップする必要がありますか? – ms123

+1

はい。関数を呼び出す前に、呼び出し元はspを減らして戻り値のための十分なスペースを確保します。関数が終了すると、呼び出し元はスタックの先頭に戻り値を持ちます(戻り先アドレスはすでにポップされています)。スタックをどこかに割り当ててスタックからポップする必要があります。 – amit