[解決済み] なぜスタックは下向きに成長するのでしょうか?
疑問点
私は、私が個人的に精通しているアーキテクチャ (x86、6502 など) では、スタックは通常下向きに成長することを知っています (すなわち、スタックに押されたすべてのアイテムは、増加したものではなく、減少した SP になります)。
これに対する歴史的な根拠について疑問があります。統一アドレス空間では、データ セグメントの反対側 (たとえば) でスタックを開始するのが便利なので、両側が途中で衝突した場合にのみ問題が発生することは知っています。しかし、なぜスタックは伝統的に上部を取得するのでしょうか。特に、これが「コンセプト モデル」の反対であることを考えると、どうでしょうか?
(また、6502 アーキテクチャでは、スタックは単一の 256 バイトのページに束縛されているにもかかわらず、下に向かっても成長し、この方向の選択は恣意的であると思われることに注意してください)。
どのように解決するのですか?
歴史的な根拠については、(私が設計したわけではないので)確かなことは言えません。私の の考え は、初期の CPU は元のプログラム カウンターを 0 に設定し、コードが自然に上向きに成長するため、スタックをもう一方の端から開始し、下向きに成長させることが自然な欲求であったということです。
余談ですが、このリセット時にプログラム カウンターを 0 に設定することは すべて 初期の CPU には当てはまりません。たとえば、Motorola 6809 では、プログラム カウンターをアドレス
0xfffe/f
そのため、そのアドレスに何が供給されているかに応じて、任意の場所から実行を開始することができました (通常は ROM ですが、決してそれに限定されるわけではありません)。
歴史的なシステムが最初に行うことの 1 つは、書き込まれた値と同じ値を読み出す場所を見つけるまで、メモリを先頭からスキャンして、実際にインストールされている RAM を知ることでした (たとえば、64K アドレス空間を持つ z80 は、必ずしも 64K または RAM を持っているとは限らず、実際には 64K は 大量 を使用していました)。実際のトップアドレスが見つかると、スタックポインタを適切に設定し、サブルーチンの呼び出しを開始することができるようになります。このスキャンは、一般に、CPU が起動の一部として ROM でコードを実行することによって行われます。
スタックの成長に関しては、すべてのスタックが下向きに成長するわけではありません。 この回答 を参照してください。
関連
-
[解決済み] なぜJavaのVector(およびStack)クラスは時代遅れ、または非推奨とされているのですか?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
-
[解決済み】PythonでIoC / DIが一般的でないのはなぜ?
-
[解決済み】ドメイン駆動型設計。ドメインサービス、アプリケーションサービス
-
[解決済み】コンポーネントベースのゲームエンジン設計【クローズド
-
[解決済み】「Layer」と「Tier」の違いは何ですか?
-
[解決済み】オブジェクト指向のプロジェクトはどのように設計するのですか?[クローズド]
-
[解決済み】マイクロサービスアーキテクチャでGraphQLを使用するタイミングと方法
-
[解決済み】なぜLinuxはモノリシックカーネルと呼ばれるのですか?
-
[解決済み] React / Reduxと多言語(国際化)アプリ - アーキテクチャ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Redisにするタイミングは?MongoDBにするタイミングは?[クローズド]
-
[解決済み】ドメイン駆動型設計。ドメインサービス、アプリケーションサービス
-
[解決済み】コンポーネントベースのゲームエンジン設計【クローズド
-
[解決済み】「Layer」と「Tier」の違いは何ですか?
-
[解決済み】マイクロサービスアーキテクチャでGraphQLを使用するタイミングと方法
-
[解決済み】なぜLinuxはモノリシックカーネルと呼ばれるのですか?
-
[解決済み] UUIDを使わざるを得ないデザインとは?
-
[解決済み] フィーチャーフラッグとは?
-
[解決済み] React / Reduxと多言語(国際化)アプリ - アーキテクチャ
-
[解決済み] Elixir/erlangはマイクロサービスアプローチのどこに位置づけられるのか?[クローズド]