1. ホーム
  2. architecture

[解決済み] なぜスタックは下向きに成長するのでしょうか?

2022-10-16 12:11:09

疑問点

私は、私が個人的に精通しているアーキテクチャ (x86、6502 など) では、スタックは通常下向きに成長することを知っています (すなわち、スタックに押されたすべてのアイテムは、増加したものではなく、減少した SP になります)。

これに対する歴史的な根拠について疑問があります。統一アドレス空間では、データ セグメントの反対側 (たとえば) でスタックを開始するのが便利なので、両側が途中で衝突した場合にのみ問題が発生することは知っています。しかし、なぜスタックは伝統的に上部を取得するのでしょうか。特に、これが「コンセプト モデル」の反対であることを考えると、どうでしょうか?

(また、6502 アーキテクチャでは、スタックは単一の 256 バイトのページに束縛されているにもかかわらず、下に向かっても成長し、この方向の選択は恣意的であると思われることに注意してください)。

どのように解決するのですか?

歴史的な根拠については、(私が設計したわけではないので)確かなことは言えません。私の の考え は、初期の CPU は元のプログラム カウンターを 0 に設定し、コードが自然に上向きに成長するため、スタックをもう一方の端から開始し、下向きに成長させることが自然な欲求であったということです。

余談ですが、このリセット時にプログラム カウンターを 0 に設定することは すべて 初期の CPU には当てはまりません。たとえば、Motorola 6809 では、プログラム カウンターをアドレス 0xfffe/f そのため、そのアドレスに何が供給されているかに応じて、任意の場所から実行を開始することができました (通常は ROM ですが、決してそれに限定されるわけではありません)。

歴史的なシステムが最初に行うことの 1 つは、書き込まれた値と同じ値を読み出す場所を見つけるまで、メモリを先頭からスキャンして、実際にインストールされている RAM を知ることでした (たとえば、64K アドレス空間を持つ z80 は、必ずしも 64K または RAM を持っているとは限らず、実際には 64K は 大量 を使用していました)。実際のトップアドレスが見つかると、スタックポインタを適切に設定し、サブルーチンの呼び出しを開始することができるようになります。このスキャンは、一般に、CPU が起動の一部として ROM でコードを実行することによって行われます。

スタックの成長に関しては、すべてのスタックが下向きに成長するわけではありません。 この回答 を参照してください。