1

これは、ARM やその他のレジスタ ベースのマシンでのスタックの実装に関連する非常に基本的な質問です。LDM および STM コマンドを使用して、スタック操作またはブロック コピーのためにメモリと汎用レジスタのグループ間で複数の値を移動できます。LDM または STM 操作は、スタックを実装する方法の規則を変更するようには見えず、複数の転送を実行するために必要なコードの長さを削減するのに役立ちます (たとえば、関数の開始時と終了時の複数のレジスタの内容の一般的な転送)。ただし、値がメモリから読み込まれた後、読み込まれたレジスタがスタックのように動作するかどうかは不明です。

スタックが外部メモリ、レジスタ、またはその 2 つの組み合わせで実装されているかどうかについては、少し混乱しています。

よろしくお願いします!

4

2 に答える 2

3

スタックはメモリです。一部のプロセッサでは、これは特別な内部メモリですが、メモリです。ほとんどの場合、実際にはシステム メモリを指すスタック ポインタ レジスタに過ぎず、プログラマ (オペレーティング システムおよび/またはアプリケーション) がそれらのメモリを確認する必要があります。スタックポインタは、他の何かに使用されているメモリを指していません。

アイデアは、レジスタのセットが限られているということです。十分な数のレジスタがある場合でも、たとえば、再帰や、何かに使用されているいくつかのレジスタを再利用する必要があるようなことをしたい場合があります。そうしないと。スタックは、基本的に、物事、レジスタ、ローカル変数、戻りアドレス、または一時的に保存する必要があるものを一時的に保存するために、シンプル/高速の malloc と free を提供します。

RAMの代わりにスタックを使用する理由、またはレジスタが多い場合でもスタックを使用する理由は、スタックを使用すると、前述のように再帰を行うことができ、同じコードを数回/数百回入力でき、たとえばそのコードにいくつかの必要に応じて、各ローカル変数の個々のインスタンスすべて、数百のコピーを追跡できます。スタックを使用する方法はスタック ポインターに対して相対的であるため、スタック ポインターへのハードコーディングされた参照があるハードコードされたアドレスを持っていないため、関数を 1 回入力し、スタック ポインターがたまたま 0x1000 にある場合、最初の変数次に 0x1000 で 2 番目が 0x1004 である可能性があります。たとえば、関数が 16 バイトの情報をスタックに「追加」してから自分自身を呼び出すと、今回はスタック ポインターに入るときに 0xFF0 になります。

于 2013-08-13T23:24:15.130 に答える
1

ARM アーキテクチャには、レジスタに可能なスタック実装がありません。ARM には ARM モードで 16 個の汎用レジスタがあり、r13 も特定Stack Pointer / SPの状況でバンクされるように定義されているため、ネストされた呼び出しを処理するためのハードウェア サポートが得られます。この ARM アーキテクチャ以外では、スタックの追加サポートは提供されません。

メモリ内ではなくスタック実装を提供するアーキテクチャについては、ウィキペディアのスタックに関する記事を参照してください。レジスタまたは専用メモリ内のスタック

于 2013-08-14T07:03:36.903 に答える