MIPSアセンブリには、スタックポインタ用のレジスタがあります。フレームポインタ用の別のレジスタ。フレームポインタとは何ですか?その目的は何ですか?スタックポインタとどのように異なりますか?
コメント
- すでにどのような調査を行っていますか?また、用語についてどの程度理解していますか?これはどのシステムに適していますか(システムごとに用語が異なります)?
- フレームポインタ(mipsアセンブリ)に慣れたいだけです。 'それがどのように役立つのかわかりませんが、なぜそれが必要なのですか?どうもありがとうございました
回答
MIPSアセンブリでは、スタックポインタはスタックの最上位を指します。スタックにスペースを割り当てると、スタックポインタ($ sp)が移動して空きメモリを指します。
MIPSアセンブリでサブルーチンを呼び出すとき(当時、レジスタは貴重でした-レジスタベースのパラメータ型にはまらない場合)、パラメータをスタックに書き込んでから、スタックポインタを進めます。
メソッドが開始されると、パラメータは16($sp)
。ただし、変数がスタックに配置されると、スタックポインターが移動し、同じパラメーターが代わりに24($sp)
に配置されるようになります。これにより、コードが少し混乱する可能性があります。
フレームポインタ($ fp)は、スタックフレームの開始を指し、サブルーチン呼び出しの間は移動しません。これはスタックフレームのベースを指し、サブルーチンに渡されるパラメータはフレームポインタに対して一定の位置に留まります。
フレームポインタを保存して復元する必要があることを認識してください。
さらに読む:
- UWisc Madison CS 354 MIPS規則
- 第3章MIPSアセンブリ言語
- UMD CS 311 理解スタック
- UWash Seattle CSE 410 MIPS呼び出し規則の概要
- ウィキペディアフレームポインタ
コメント
- しません' "レジスタが当時プレミアムであったことの意味がわからない-型にはまらない"がパラメータであるレジスタベースのパラメータレジの数が多いときにスタックに置くこともできますスターは限られています。たとえば、35個のパラメータがある場合(MIPSには32個のレジスタがあると思います)、最後の3個のパラメータをスタックに配置する必要があります。実装に固有のFPは、リターンアドレスがあるメモリ内のアドレスにあります。
- @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 I 'もこのコメント:" AMD Bulldozer:96物理GPR、Intel Sandy Bridge:160物理GPR、Intel Haswell:168物理GPR "。複数のコアマシンで物事がおかしくなります。 SPARCには 160個のレジスタがありました。また、レジスタウィンドウを紹介します。このウィンドウは、同時代のレジスタの半分の数のレジスタを備えたMIPSの設計哲学の一部です。
- 、これは、x86呼び出し規約での
%ebp
ベースポインタレジスタの従来の使用と同じです。 (私は'これらすべてに不慣れですが、MOV 8(%ebp), %eax
などのsthを使用するのと同じ基本的なことのように聞こえますか?) - 行
Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.
は、それが何を意味するのか明確ではありません