(この質問が重複しているか、ここですでに回答されている可能性が高いと思いますが、「スタック割り当て」および関連用語からの干渉のおかげで、回答を探すのは困難です。)
スクリプト言語用に取り組んでいるおもちゃのコンパイラがあります。進行中のスクリプトの実行を一時停止してホスト プログラムに戻ることができるようにするために、スクリプトには独自のスタックがあります。通常の C コード操作を使用してインクリメントされる「スタック ポインター」変数を持つ単純なメモリ ブロックです。そのようなことなどのために。今のところ面白くない。
現時点では、C にコンパイルします。しかし、マシン コードへのコンパイルについても調査したいと考えています。同時に、セカンダリ スタックと、定義済みの制御ポイントでホスト プログラムに戻る機能を維持します。
だから...自分のコード内で従来のスタックレジスタを使用することは問題になる可能性は低いと思います.レジスタに何が起こるかは、それが完了したときにすべてが復元される限り、私自身のビジネスであると思います.この点は間違っています)。しかし...スクリプトコードを他のライブラリコードに呼び出す場合、この「仮想スタック」を使用してプログラムを離れても安全ですか、それともこの目的のために元のスタックを返すことが不可欠ですか?
this oneおよびthis oneのような回答は、スタックが従来のメモリブロックではなく、ページフォールトなどを処理するための特別なシステム固有の動作に依存していることを示しています。
そう:
- スタックポインタをメモリの他の領域に移動しても安全ですか? スタックメモリは「特別」ではありませんか? スレッドライブラリは、より多くのスタックを作成するため、このようなことをしなければならないと思います...
- メモリのどの領域もスタック レジスタと命令を使用して安全に操作できると仮定すると、既知の呼び出し深度 (つまり、再帰なし、関数ポインターなし) で関数を呼び出すことが問題になる理由は思い浮かびません。 amount は仮想スタックで利用可能です。右?
- いずれにせよ、スタック オーバーフローは通常のコードでは明らかに問題ですが、そのようなシステムでオーバーフローが発生すると、さらに悲惨な結果が生じるでしょうか?
ポインタを実際のスタックに戻すだけで完全に機能するため、これは明らかに実際には必要ありません.まったく(少なくとも、明らかに私の深みから外れているため)。しかし、私はまだどちらにしても興味があります。これらの種類のものがどのように機能するか知りたいです。
編集:もちろん申し訳ありませんが、言うべきでした。私は x86 (自分のマシンでは 32 ビット)、Windows、および Ubuntu で作業しています。エキゾチックなものは何もありません。