最初に、スタックの理解が不十分であることを示します。次に、適切に構成された回答を引き出すほど具体的ではないため、適切に回答できない、やや首尾一貫した質問をします。
では、プログラムが実行されると、関数がスタックにプッシュされます。これは、スタック ポインターがインクリメントまたはデクリメントされることを意味しますか?
スタックメモリ割り当てには正確に何が格納されていますか? 変数データへのポインタ、プログラムの est へのポインタ? スタックに正確に何が保存されているのか(どのデータ型、どの種類の参照、どのように保存されているか)を理解していないだけです。関数がローカル変数ポインターとそれを呼び出したアドレスへのポインターを保存して、返すことができると期待しています.
また、Windows x86 仮想メモリの割り当ては、実際には仮想メモリの 1 つのブロックを任意の多くの物理メモリ アドレスにマップするため、Windows x86 システムの物理メモリ内でスタックが連続しているかどうかは?
最後に、スタックが x86 上の 32 ビット ウィンドウ上のアプリケーションのユーザー割り当て仮想メモリに格納されていると仮定すると、スタック ポインター (上位または下位メモリ アドレスを参照する?) は 31 ビット (ユーザー割り当て上位 2GB はカーネル割り当て用に予約されています) リトルエンディアン参照ですね。
そして、データがスタックに到達すると (関数が入力され、新しい DWORD にメモリが割り当てられるように)、その DWORD に格納するデータがスタックにプッシュされ、スタック ポインターがインクリメントまたはデクリメントされますか? また、システムはどのようにしてスタックの両端を同時に認識しているのでしょうか?
----ここにESP?
|-変数 x の参照アドレス
|-関数 1 の変数 x のメモリ アドレスに格納される整数データ
|----関数 1 ブロック上 ^^
| |
| |
---- またはここで ESP?
ここから、参照アドレスと整数データがレジスタにポップされ、mov 操作によって整数データが割り当てられたメモリ位置に格納されますか?
新しいデータがスタックにヒットすると、スタックが「下向き」に成長すると聞いたことがありますが、メモリアドレスの上限と下限しかないため、それは不合理に思えます-スタックの一方の端だけをインクリメント/デクリメントする必要があることは理解していますが、上位アドレスまたは下位アドレス、およびスタックの長さ (高さ) はどのように区切られていますか? スタックが大きくなりすぎた場合、システムはどのように理解するのでしょうか?
質問ばかりで申し訳ありませんが、私はたくさんの本を読んできましたが、私が読んだ概念を説明するために使用された用語は、私の語彙ではうまく機能していません。また、グーグル、ウィキペディア、およびこのサイトを少し調べましたが、私の特定の懸念に対処する説明が見つかりませんでした.
ありがとう。