2016-09-30 5 views
2

私はいくつかの場所でこれを読んだが、理由を完全に理解していない。私はすべての命令がMIPS32の4バイトにワードアライメントされなければならない理由を理解しています。MIPSのスタックポインタをダブルワードで整列させる必要があるのはなぜですか?

しかし、私はを読みました。スタックポインタはダブルワードアライメントでなければならないので、スタックフレームは8の倍数でなければなりません。どうして?

スタックを8バイトの倍数に埋め込む理由を除いて、添付画像のすべてを理解しています。

Stack Frame

編集:私は、これはhere、3ページ、他の4箇条書きました読みところの1つの供給源は、下、パターソンとヘネシー、付録A.6によってコンピュータの構成&デザイン、第5版、でしたプロシージャ呼び出しの例。しかし、MIPS32について話していたと誤解されていた今、私には明らかです。

+3

MSDN:_ "MIPS ISA IおよびIIは、32ビットモードで動作し、スタックポインタとフレームポインタのアドレスが4バイトの境界に揃うことを要求します。MIPS ISA III以降は64ビットモードで動作し、スタックポインタとフレームポインタのアドレスが8バイトの境界に揃うようにする必要があります。 "そうでなければ、' sd'を使って64ビットの値をスタックにプッシュしようとすると、アライメントエラーが発生します。 – Michael

+0

マイケルに感謝します。これは単に、64ビットのスタックポインタアドレスまたはリターンアドレスを潜在的に収容するための予防措置を意味していますか?私たちが32ビットモードで動作していても? –

+1

32ビットMIPSには8バイトのスタックアライメントが必要ですか?マイケルは、8B要件が64ビットモードでのみ適用されると言っているようです。しかし、8Bアライメントは、32ビットモードでスタック上に 'double '精度の浮動小数点を格納するのを容易にするので、いくつかのABIは8Bスタックアライメントを必要とするかもしれません。とにかく、これを読んだ場所へのリンクを追加してください。 –

答えて

3

MIPSアーキテクチャでは、メモリ内のデータ型に、そのサイズに合わせて均等にアクセスすることしかできません。ドミニクSweetmanによって

参照MIPSの実行は、ページ320に書かれています:サブルーチンが呼び出された時点で

、SPが最大の基本的なタイプのアライメントを合わせる、8バイト境界で整列する必要があります - long longの整数、または浮動小数点の倍精度浮動小数点数です。 8バイトのアライメントは、あなたがスタックにdoubleをプッシュしようとしないならば、あなたは非常によく生きることができ、このように...

を32ビットMIPSの整数ハードウェアで必要ですが、それは、互換性のために不可欠であるされていません32ビットシステムで4バイトアライメントを使用します。あなたのOSができるかどうかは、もう一つの質問です。

関連する問題