2011-12-10 2 views
1

HLAでは、のパラメータがアクティベーションレコードにどのくらい格納されていますか?HLAのアクティベーションレコード

私はこのトピックについて多くのことを読んだことがありますが、 の問題は、パラメータが「4バイト未満」のデータ型の場合です。

例えば

:それはどこにも言及されていないので、全てのパラメータは、(少なくとも)4バイトのブロックを割り当てることは、

(すべてのパラメータがVALであることに留意されたい)

Procedure proc(VAL i:int32; VAL j:int16; VAL k:int16);@nodisplay; 

、 私はkがEBP + 8、EBP + 10、EBP + 12であると期待します。

しかし、いくつかのstdout.putsによると、そうではありません。 (少なくとも私のシステムにはない) kはEBP + 8、jはEBP + 12、iはEBP + 16です。

4バイトブロックを割り当てるリソースがありますか? 私のHLAが正しく動作していませんか?

答えて

2

ローカル変数とパラメータはスタックに格納され、スタックには32ビットモードで一度に固定の32ビットが割り当てられます。パラメータが32ビットよりも小さい場合でも、それらはスタック上で32ビットを占有します。

+0

はい、それは意味がありますが、ローカル変数は32ビット空間全体を占有しません。これを考慮してください: ** VAR x:int32; y:int8; z:int16; ** この場合、xはEBP + 4にあり、yはEBP + 5にあり、zはebp + 7にあります。そして、ESPをEBP + 8に向けることによって、32ビットの完全性が依然として残っている。 要するに、変数セクション全体**がメモリ内の4バイトの倍数を占めているようです。一方、パラメータはパラメータ**あたり4バイト**の倍数を占有します。 _(申し訳ありませんが、コメントで正しく書式設定するのは難しいです)_ – JaySicks

+0

私はそれらの変数のレイアウトを取得しませんでしたが、それが本当にあなたがHLAの好奇心であるbyteborderローカル変数を宣言できる場合。パラメータに同じ機能を含まないことにした場合、呼び出し元が複数のdwordがある場合にパラメータをスタックに置くことが難しいためかもしれません。 –

+0

私は、アラインされていないローカル変数がそれほど奇妙ではないことを認識しました。私は決してそれらを使用しません:)結論はまだ成立しています。 –

関連する問題