CPUがスタックをサポートするとはどういう意味ですか?


11

CPUがスタックをサポートできないのはなぜですか?サブルーチンを使用するアーキテクチャー(すべてのアーキテクチャーであると確信しています)は、戻りアドレスをスタックにプッシュして、サブルーチンを呼び出した場所に戻る必要があるのではないですか?スタックとは、特定の方向に成長し、スタックデータ構造として機能するポインターを備えたメモリのセクションを意味するだけですか?アーキテクチャがスタックをサポートできなかった理由がわかりません。

自動メモリストレージ(自動変数と静的変数)は、コンパイラとハードウェアアーキテクチャによってどの程度決定されますか?

回答:


8

サブルーチンコール/リターンおよび割り込み処理用のハードウェアスタックを備えた多くの低レベルマイクロコントローラーがありますが、そこにデータ(変数)を格納することは不可能ではないにしても困難であり、純粋なソフトウェアデータスタックの実装は非常に非効率的です。8051は1つの古典的な例であり、ローエンドPIC(PIC12 / PIC16)は別の例です。これらのマシンでは、自動変数に静的な格納場所を割り当てることでデータスタックがエミュレートされ、これらの場所の再利用量はコンパイラーの洗練度に依存します。

スタックエミュレーションがこの方法で実行されている場合、再帰(直接または間接的にそれ自体を呼び出す関数)が機能しないことに注意してください。関数の各インスタンスは、おそらく「プライベート」変数に対して同じ静的な場所を再利用するためです。一部のコンパイラーは、再帰の制限された使用を許可します(通常#pragma、ある種の手段によって実装されます)。これにより、どれほど遅くしても真のデータスタックが作成されます。

余談ですが、DEC PDP-8やIBM System / 360など、サブルーチンや割り込みの処理も含めて、ハードウェアスタックがまったくないCPUアーキテクチャが存在します。これらのマシンでは、PC(リターンアドレス)とステータスレジスタ(割り込み用)はレジスタまたはメモリロケーションに保存されていましたが、すべてのインスタンスで、スタックを簡単に作成できる十分に柔軟なアドレスモードがマシンにあったと思いますソフトウェアで。


1
以前の一部のコンピューターはコードにジャンプ命令を書き込んで、戻りを引き起こします-間接ジャンプはありません-リエントラント関数を非現実的にします(理論的にはジャンプを分岐することができますが、特にデータアドレスが完全にエンコードされている場合、複雑さを増します)手順で)。
Paul A. Clayton

4

「スタックのサポート」とは

  1. 明示的なスタックポインタレジスタを持ち、
  2. スタックポインタレジスタを操作/使用するためのプリミティブマシンコード命令を持っている(関数呼び出しから戻るためにスタックポインタに基づいてプログラムカウンタを変更するretiなど)。

ハードウェアサポートなしでエミュレーションを介してこれをエミュレートできます。エミュレーションは、変数を使用してRAMで同じようなものを生成するコンパイラー生成コードです。最新のコンピュータアーキテクチャでスタックを直接サポートしていないことはまれです。

プログラミング言語の変数のセマンティクスは、ストレートアセンブリよりも高い言語の場合、ターゲットハードウェアアーキテクチャとはほとんど関係ありません。コンパイラの仕事は、プログラミング言語のセマンティックコントラクトに準拠するマシンコードを生成することです。


1
ほとんどのRISC ISA(たとえば、MIPS(MIPS16とmicroMIPSを除く)、Alpha、SPARC、PA-RISC、Power、SuperH)には明示的なスタックポインターレジスタがなく、代わりにABIで定義されています。ARMは例外であり(一部はいくつかの動作モードでSPをシャドウしているため)、MIP16およびmicroMIPS(コード密度の場合)も同様です。
ポールA.クレイトン

2

一部のアーキテクチャ(PICなど)には、機能が制限されたハードウェアスタックがあります(変数ではなく、戻りアドレスにのみ使用できます)。非常に小さなアーキテクチャの中には、ストアアンドインクリメントやPUSH命令を持たないものがあるため、スタックを作成するのが面倒です。

Cの「auto」変数は、常に「auto」初期化動作を使用してコンパイルされ、「static」は静的動作を使用してコンパイルされます。一部のアーキテクチャでは、再帰を実行することが許可されていません。その場合、コンパイラはすべての変数を静的に割り当てることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.