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が正しく動作していませんか?
はい、それは意味がありますが、ローカル変数は32ビット空間全体を占有しません。これを考慮してください: ** VAR x:int32; y:int8; z:int16; ** この場合、xはEBP + 4にあり、yはEBP + 5にあり、zはebp + 7にあります。そして、ESPをEBP + 8に向けることによって、32ビットの完全性が依然として残っている。 要するに、変数セクション全体**がメモリ内の4バイトの倍数を占めているようです。一方、パラメータはパラメータ**あたり4バイト**の倍数を占有します。 _(申し訳ありませんが、コメントで正しく書式設定するのは難しいです)_ – JaySicks
私はそれらの変数のレイアウトを取得しませんでしたが、それが本当にあなたがHLAの好奇心であるbyteborderローカル変数を宣言できる場合。パラメータに同じ機能を含まないことにした場合、呼び出し元が複数のdwordがある場合にパラメータをスタックに置くことが難しいためかもしれません。 –
私は、アラインされていないローカル変数がそれほど奇妙ではないことを認識しました。私は決してそれらを使用しません:)結論はまだ成立しています。 –