0

我在密歇根大学自学计算机体系结构。我不明白为什么 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/)很好。

4

2 回答 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 回答