2013-08-12 18 views
9

私はCのスタックとRISCやARMのようなプロセッサ用のアセンブラのスタックの違いは何ですか?アセンブリのスタックとスタックのスタック?

Proffesorは、スタックは、両方のデータだけが保存され、あなたが他のサブジェクト(私たちはCについて学ぶアルゴリズムと構造、)私の知る限り思い出すことができるよう

上について学んだスタックとは異なっている、注意が必要、と述べましたメモリ内でLastInFirstOutスキームの両方の関数は、両方とも使用後にクリーンアップする必要があります。

つまり、彼らは2つの異なる "世界"にあるので同じではありませんが、私はそれらとは異なる重要なものを逃していますか?多分それはそれですが、それ以来、私を悩ませていました。

ありがとうございました

+2

CまたはC#を意味しますか? – Liam

+7

_ "RISCやARMのようなプロセッサ" _。 RISCは単なるコンセプトですが、ARMはRISC型アーキテクチャの具体的な設計です。 – Michael

+0

教授は、コール/リターンスタックが(部分的に)ハードウェアで管理されているため、おそらくそれが異なることを意味します。 –

答えて

9

スタックはまったく同じです。プログラム混在アセンブリ/ Cを書くことができ、それらは同じスタックを使用します。

Cコンパイラでは、スタックの使用方法にいくつかの規則が使用されています。整形されたスタックフレームが各関数エントリに書き込まれます。機能が終了するとクリーンアップされます。スタック管理を変更するためのコンパイラ指令があります。たとえば:gcc stack checking

ウェブ上のいくつかの参照:アセンブリ内google : c stack frame

、スタックはプログラマによって完全に管理する必要があります。スタックの管理命令はまた、ARMのpushpop x86の上、またはstmia/ldmfdのような、非常にプロセッサに依存(命令です

スタックの管理方法についてのルールを持つことは良い習慣です(例えばC規則を模倣します)同様に、いくつかのプロセッサは、スタックポインタ専用のレジスタを持っています(esp、x86)。それ以外は通常のものです(ARM7ではr13)。

デバッガを使用して、フレームの内容を確認するバックトレース。

アセンブリレベルでのx86スタックの理解をお勧めします。this Wikipedia articlethis one for stack frames

+1

それが私の問題を解決しました! しかしもう1つ質問があります。 :) ヒープc /アセンブリとは何ですか? –

+4

別の質問としてこれを聞いてください。ヒープはlibc固有のものであり、アセンブリに相当するものはありません( 'malloc' /' free'はありません)。しかし、アセンブリからlibcを呼び出して、ヒープにアクセスすることはできますが、それはエキスパートプログラミングです。 –

2

自動変数のスタックモデルではなくoverlayモデルを使用するコンパイラを見てきました。言語は自動変数の割り当てと割り当て解除をスタックとして提示しますが、基本的な実装はそうである必要はありません。

一部のコンパイラでは、Cスタックは存在しますが、ハードウェアスタックとは別のものです。

次に、register-windowsのような概念があります。

リストには続きますが、私はあなたの教授が念頭に置いていたこと、あるいは私が正しい方向にいることさえ保証できませんでした。確実に答えられるのは一人だけです。

これらのバリエーションのほとんどは、概念的にはスタックと一貫していますが、実装の詳細は両方の言語を使用している場合に注意する必要があります。

1

概念的なスタックとx86スタック(そして場合によっては他のアーキテクチャ)の違いは、スタックの成長方向です。(アーキテクチャによっては)実際にがメモリ内にのように成長するときにスタックが成長するように教えるのは一般的です。