私はミシガン大学でコンピューター アーキテクチャのオファーを独学しています。d のメモリ レイアウトが 308 http://www.flickr.com/photos/45412920@N03/4442695706/ ではなく 312 から 319 で始まる理由がわかりません。( http://www.flickr.com/photos/45412920@N03/4442695706/ )指定された黄金律を理解していなかったのかもしれませんhttp://www.flickr.com/photos/45412920@N03/4441916461/sizes/l /こちら( http://www.flickr.com/photos/45412920@N03/4441916461/sizes/l/ ) そうですね。
2 に答える
2 番目のリンクは、MIPS が変数をパックできないことを示しています。したがって、それらが占めるアドレスはワード境界に収まる必要があります。
short がハーフワードでアラインされている場合は 2 バイト、int はワードでアラインされているため 4 バイト、double はダブルワードでアラインされている必要があるため 8 バイトを使用します。
これらの場所で整列するために..
最下位ビット (LSB) のゼロは、1 つおきまたは 2 バイトごと (ハーフ ワードで整列) を示し、2 つのゼロは 4 バイトごとを示し、3 つのゼロは 8 バイトごとを示します。
Address (4 LSBs)
XXX0 - half word aligned (2 bytes)
XX00 - Word aligned (4 bytes)
X000 - Double word aligned (8 bytes)
double はダブル ワード アラインメントである必要があるため、308 (100110100) で開始することはできません。これは、ワード アラインメントのみ (2 LSB = 0) であるためです。次のダブル ワード アラインメント 312 (100111000) で開始する必要があります。
[Addr] [Binary] [Alignment]
300 100101100 Word, Half-Word
301 100101101
302 100101110 Half-Word
303 100101111
304 100110000 Double-Word, Word, Half-Word
305 100110001
306 100110010 Half-Word
307 100110011
308 100110100 Word, Half-Word
309 100110101
310 100110110 Half-Word
311 100110111
312 100111000 Double-Word, Word, Half-Word
MIPS でのメモリ アクセスはワード アラインされます。つまり、一度に 32 ビット/4 バイトのメモリを読み取ります。変数 "b" は 1 バイトなので、実際にはアドレス 300 ~ 303 を読み取ります。変数 "c" が 301 から始まる場合、プロセッサは "b" が 1 バイトにすぎないことを認識し、他のバイトをゼロにして、場合によってはそれを LSB 位置にシフトする必要があります (または、コンパイラがそうする必要があります)。いずれにせよ、4 バイト境界 (4 の倍数) ですべてのメモリ アクセスを停止する方が効率的です。
詳細については、データ構造のアライメントを参照してください。