5

ここで、スタックの成長の方向性について1つの質問がありました。Michael Burrが、ARMプロセッサではスタックの成長方向を構成できると答えました。つまり、降順(通常の動作)スタックはメモリ内のゼロアドレス(下位アドレス)に向かって成長するか、昇順、つまりスタックはメモリ内の上位アドレスに向かって成長します。

最新のシステムのスタック成長の方向性は何ですか?

私の質問は、ARMプロセッサで、スタックを昇順で成長させるにはどうすればよいですか?

デフォルトで降順であるのと同じようにスタックを昇順で構成するにはどうすればよいですか?レジスタビットのセット/リセットなど。

4

3 に答える 3

6

ARMプロセッサはスタックを直接維持しませんが、それを念頭に置いて設計された命令(LDMとSTM)があります。したがって、関数の最初にSTMDBを使用し、最後にLDMIAを使用すると、実質的に完全+降順のスタックができます。私が使用したことを覚えているアセンブラーでは、エイリアスとして「STMFD」と「LDMFD」を記述できます。(「フル」スタックとは、スタックポインターが、次に使用する場所ではなく、スタック上の最新の単語を指しているスタックです)

したがって、実行時に単純に再構成できるものではありません。ただし、独自の呼び出し規約を使用して独自のオペレーティングシステムを作成している場合は、昇順スタックを使用することを選択できます。同様に、スタックポインタとしてR13を使用しないことを選択することもできます。これは、呼び出し規約の一部にすぎません。この選択は、スタックを使用するすべての関数の実装に効果的に組み込まれます。

于 2009-05-25T12:02:06.410 に答える
1

Stack-Start、Stack-End を使用して SP を変更し、Heap-Start、Heap-End を使用してヒープの再配置を行うのに役立つ__user_initial_stackheap()関数があります。ARM はこれを使用してスタックとヒープをリダイレクトするため、この関数は初期化時に使用できます。

また、[要件に応じて] 単一リージョンまたは 2 メモリ モデルを使用するオプションもあります。この API は、ARM926EJ-S を使用したユースケースを作成する際に使用しました。

このドキュメントは、私の開発中に役に立ちました。また、あなたにも役立つかもしれません。

お役に立てれば。

-hjsブロガー

于 2009-10-13T09:36:20.900 に答える
0

うーん、thumb / thumb2は、プッシュ/ポップに制限される可能性があります。thumb2では、ARMのみが存在するため、一般的に、両方の方法で実行できるとは言えません。従来のアーム命令、はい、ldmiaまたはldmdb(前にインクリメントまたは前にデクリメント)およびstmdbとstmiaを使用できます。たとえば、Cコンパイラを、自動的に下降するのではなく、アドレスを上昇させるにはどうすればよいでしょうか。わからない。

これは、ARMのビッグエンディアンのようなものです。それは、ARMに伴う頭痛の種のために、おそらくそうしたくないという理由だけです。

于 2009-05-26T17:03:30.670 に答える