3

特に理由もなく、関数を呼び出す前にスタック ポインターから減算するアセンブリ コードを見たことがあります。差し引かれたスペースは空のままで、使用されません。

sub    esp, 8    ; stack align
push   dword y
push   dword [x]
call   foo
add    esp, 16
mov    [x], eax

sub esp, 8コードの作成者は「スタック整列」というコメントを追加しましたが、「スタック整列」が何を意味するのか、コマンドがどのようにそれを達成するのに役立つのかわかりません。

何か案は?

4

1 に答える 1

3

関数が入力されたときにスタック ポインターがキャッシュ ラインにアラインされている場合、関数の実行によるキャッシュへの負荷が軽減される可能性があります。

そのため、コンパイラ システムは、関数がキャッシュ ラインにアラインされた SP で入力されることを主張するように編成できます。コンパイラは、各呼び出しサイトで使用されたスタックの量、事前に SP を再アラインするのにどれだけかかるかを知っています。それは電話をかけます。

それはあなたの例を説明するでしょう。スタック自体は適度な距離で拡大/縮小する傾向があり、そのローカルストレージを何度も再利用することにより、全体としてキャッシュに多くの要求を課さないため、多くのコンパイラが実際にこれを行うのを見たことがありません。

もう 1 つの用途は、呼び出し先が作業するためのスペースを割り当てること、またはレジスターに収まるものよりも大きな結果を返すことです。コンパイラはそのようなコメントを書きません。たぶん、彼は自分が何をしているかを知っていました。多分彼はしませんでした。呼び出された関数がこのスペースを必要としない場合は、無駄な命令です。

于 2012-06-04T18:24:56.083 に答える