2016-08-21 12 views
0

講義では、アセンブラでどのようにパラメータを渡すことができるかを話しました。メモリ、レジスタ、スタックという3つの異なるメカニズムを区別しました。 これらの特徴の1つは、メモリとレジスタはサブプログラムでの再帰をサポートしていませんが、スタックでは再帰をサポートしていません。スタックとは何故、メモリとレジスタは再帰を許可しないのですか?

なぜですか?

私は、彼らが後に(再帰)のために必要とされるかもしれないにもかかわらず、これレジスタのエントリが常に上書きされ、無視され、呼び出し元/呼び出し先が登録、保存、レジスタの場合に推測

しかし、どのようなメモリは?

答えて

3

メモリを言うと、グローバル変数のような静的な固定サイズの割り当てについて話しているようです。それらは、使用中の最後のものへのポインタをサポートしない固定サイズなので再帰をサポートできません(インデックスされたアドレッシング)。また、レジスタには両方の制限があります。

しかし、他にもメモリに保存できるものがあります。例えばcall stackはメモリの一部です。

implement recursion using a "manual" stack data structureは大規模な固定サイズのグローバル配列で指定できます。スタックオーバーフローが発生すると最終的には失敗するため、これはコールスタックのようになります。 (実際のシステムでは、コールスタックのサイズが制限されているため、無限再帰関数がすぐにセグメンテーションされます)。


TL:DR:私はあなたがの上にstack data structureを実装することができますもので再帰を実装することができると思いますが、あなたは、レジスタまたはintグローバルの束のいずれかであることを行うことはできません。


OPが(間違って)call/retをサポートしていませんでしたと思っ作らアップの命令セットについての質問に、a recent answer where I explained what recursion is in asmも参照してください。

+2

もちろん、レジスタはスタック(XTensa ISAのように)、またはスタック内のレジスタの一部(例えばSPARC、Itanium)に編成することもできますが、他のレジスタは使用されないかもしれません再帰的な部分。バージョン管理されたメモリ(通常、ハードウェアトランザクションメモリに関連付けられていますが、本来このようなインターフェイスにはバインドされていません)では、同じメモリアドレスに複数の格納場所が存在する可能性があります。 –

+0

@ PaulA.Clayton:ああ良い点。 x86のx87 FPレジスタスタックは、再帰関数によっても非常に限定された再帰深度で使用できます。 –

関連する問題