1. ホーム
  2. assembly

[解決済み] 最近のシステムでは、スタックの成長方向はどうなっているのでしょうか?

2022-11-09 20:35:22

質問

私はC言語のトレーニング資料を作成していますが、私の例が典型的なスタックモデルに適合するようにしたいのです。

Linux、Windows、Mac OSX (PPC および x86)、Solaris、および最新の Unix では、C スタックはどのような方向に成長するのでしょうか。

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

スタックの増大は通常、オペレーティング システム自体には依存せず、それが実行されているプロセッサに依存します。たとえば、Solaris は x86 と SPARC 上で動作します。Mac OSX は (あなたがおっしゃるように) PPC と x86 で動作します。Linux は、職場の大きな System z から ちっぽけな腕時計 .

CPU が何らかの選択肢を提供する場合、OS が使用する ABI / 呼び出し規約は、あなたのコードが他のすべての人のコードを呼び出したい場合、どの選択をする必要があるかを指定します。

プロセッサーとその方向性は

  • x86: 下です。
  • SPARC: 選択可能。 標準の ABI は down を使用します。
  • PPC: ダウン、だと思います。
  • System z: リンクされたリストで、冗談抜きで (ただし、少なくとも zLinux ではまだ)、ダウンしています。
  • ARM: 選択可能ですが、Thumb2 にはダウン専用のコンパクトなエンコーディングがあります (LDMIA = 後にインクリメント、STMDB = 前にデクリメント)。
  • 6502: ダウン (ただし、256 バイトのみ)。
  • RCA 1802A: SCRT の実装に従った、任意の方法。
  • PDP11: ダウン。
  • 8051: アップ。

最後のいくつかは私の年齢を示していますが、1802 は初期のシャトルを制御するために使用されたチップで (ドアが開いているかどうかを、その処理能力から推測して感知していました :-) 、私の 2 台目のコンピュータは、2 台目のシャトルを制御するために使用されました。 COMX-35 (私の ZX80 ).

PDP11 の詳細は以下から得られます。 から得たものです。 8051 の詳細は ここから .

SPARC アーキテクチャは、スライディング ウィンドウ レジスタ モデルを使用しています。 また、アーキテクチャ的に見える詳細には、有効で内部にキャッシュされているレジスタウィンドウの円形バッファがあり、それがオーバーフロー/アンダーフローしたときにトラップが発生します。 以下を参照してください。 を参照してください。 を参照してください。 として SPARCv8 マニュアルの説明では SAVEとRESTORE命令は、ADD命令とレジスタウィンドウの回転のようなものです。 通常の負の定数の代わりに正の定数を使用すると、上向きに成長するスタックが得られます。

1802 では、16 個の 16 ビット レジスタの一部を SCRT (standard call and return technique) のために使用しました。1 つはプログラム カウンターで、任意のレジスタを PC として使用するには SEP Rn 命令でPCとして使用することができました。1 つはスタック ポインターで、2 つは SCRT コード アドレスを指すように常に設定され、1 つはコール用、1 つはリターン用でした。 いいえ レジスタは特別な方法で扱われました。これらの詳細は記憶によるものであり、完全に正しいとは限らないことに留意してください。

例えば、R3 が PC、R4 が SCRT の呼び出しアドレス、R5 が SCRT の戻りアドレス、R2 が "stack" (ソフトウェアでの実装を引用) であったとすると、以下のようになります。 SEP R4 は R4 を PC に設定し、SCRT コール コードの実行を開始します。

そして、R3 を R2 スタックに格納し(R6 は一時的な格納に使用されたと思います)、それを上下に調整し、R3 に続く 2 バイトを取得し、それらをロードすることになります。 にロードします。 R3 にロードし、次に SEP R3 を実行し、新しいアドレスで実行されるようにします。

戻るには、それは SEP R5 で、R2 スタックから古いアドレスを取り出し、それに 2 を加え (呼び出しのアドレスバイトをスキップするため)、R3 にロードして SEP R3 を実行して、前のコードの実行を開始します。

6502/6809/z80 のスタックベースのコードの後に、最初にそれを理解するのは非常に難しいのですが、それでも、ある意味、壁に頭を打ち付けているようなエレガントさがあります。また、このチップの大きな売りの1つは、16本の16ビットレジスタのフルセットでしたが、そのうちの7本(SCRT用に5本、DMAとメモリからの割り込み用に2本)がすぐに失われてしまったという事実があります。ああ、現実に対するマーケティングの勝利です :-)

System z は実際には非常によく似ており、R14 および R15 レジスタを呼び出し/戻り値に使用します。