我在密歇根大学自学计算机体系结构。我不明白为什么 d 的内存布局从 312 到 319 而不是 308 http://www.flickr.com/photos/45412920@N03/4442695706/ 开始。( 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/)很好。
问问题
747 次
2 回答
1
第二个链接显示 MIPS 不能打包变量,因此它们占用的地址必须落在字边界上。
如果short是半字对齐的,它占用两个字节,int是字对齐的,所以它占用4个字节,double必须是双字对齐的,所以它占用8个字节。
为了在这些地方对齐..
最低有效位 (LSB) 中的 0 表示每隔一个或每 2 个字节(半字对齐),2 个零表示每 4 个字节,每 8 个字节有 3 个零。
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
于 2010-03-18T05:50:53.880 回答
0
MIPS 上的内存访问是字对齐的,这意味着一次读取 32 位/4 字节的内存。由于变量“b”是单个字节,它实际上读取地址 300-303。如果变量“c”从 301 开始,处理器必须知道“b”只是一个字节,并将其他字节清零,并可能将其移至 LSB 位置(或者编译器必须这样做)。无论哪种方式,仅在 4 字节边界(4 的倍数)上启动所有内存访问会更有效。
有关详细信息,请参阅数据结构对齐。
于 2010-03-18T06:00:07.297 回答