フレームポインターの説明


28

組み立てMIPS、スタックポインタのためのレジスタ、およびフレームポインタのための別のレジスタがあります。フレームポインタとは何ですか、その目的は何ですか?スタックポインターとの違いは何ですか?


1
すでにどのような研究を行っていますか?また、用語についてどの程度精通していますか?これはどのシステム用ですか(異なるシステムには異なる用語があります)?

フレームポインター(mipsアセンブリ)に精通したいです。私はそれがどのように役立つのか理解していません、なぜそれが必要なのですか?ありがとう
-qwaserdftyghuijkiii

回答:


44

MIPSアセンブリでは、スタックポインターはスタックの最上部を指します。スタックにスペースを割り当てると、スタックポインター($ sp)が移動して空きメモリをポイントします。

MIPSアセンブリでサブルーチンを呼び出すとき(当時、レジスタは高価でした-型にはまらないレジスタベースのパラメータ)、パラメータをスタックに書き込み、スタックポインタを進めます。

メソッドが開始されるとき、パラメータはのオフセットにある場合があり16($sp)ます。ただし、変数がスタックに配置されると、スタックポインターが移動し、同じパラメーター24($sp)代わりにます。これにより、コードが少し混乱する可能性があります。

フレームポインター($ fp)は、スタックフレームの開始点を指し、サブルーチン呼び出しの間は移動しません。これは、スタックフレームのベースを指し、サブルーチンに渡されるパラメーターは、フレームポインターに対して一定の場所に残ります。

フレームポインターは、それを変更するサブルーチン呼び出しで保存および復元する必要があることを認識してください。

参考文献:


「当時、レジスターは高価でした-型にはまらないレジスターベースのパラメーター」とはどういう意味なのかわかりませんが、レジスターの数が制限されている場合、パラメーターをスタックに置くこともできます。たとえば、35個のパラメーターがある場合(MIPSには32個のregがあると考えられます)、最後の3つのパラメーターをスタックに配置する必要があります。さらに実装に固有の場合、FPは戻りアドレスがあるメモリーのアドレスにあります。
ジョナサン

1
@Jonathan MIPSこれらの32個のレジスタのうち、$ 0は0です。$ atは予約済みで、$ v0と$ v1は関数呼び出しの戻り値用、$ a0-$ a3は関数パラメーター、$ t0-$ t9は一時的です(呼び出し元保存) 、$ s0-$ s7が保存され、$ gp、$ sp、$ fp、および$ raがシステム自体によって使用されました。全体として、24個の汎用レジスターのみがあり、使用したい場合にはそのうちのいくつかはオーバーヘッドが発生しました。通常、$ tレジスタのみを使用しました(10)。これを128個のレジスタを持つItaniumと比較してください。35個のパラメーターを使用してMIPSで関数を呼び出すと、おそらくすべてをスタックに置くことになります。

@Jonathan私もこのコメントを指摘します:「AMDブルドーザー:96物理GPR、Intel Sandy Bridge:160物理GPR、Intel Haswell:168物理GPR」。複数のコアマシンで物事が面白くなります。SPARCには160個のレジスタがありました。また、MIPSのデザイン哲学の一部になったウィンドウ登録することもお勧めします。MIPSは同時代のレジスタの半分です。

だから、これは%ebpx86の呼び出し規約で「ベースポインタ」レジスタの従来の使用と同じことですか?(私はすべてこれに新しいですが、MOV 8(%ebp), %eax
sth

Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.はそれが何を意味するのか明確ではありません
-zadane
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.