1

我在 MIPS 中遇到内存寻址问题。它说寻址是字对齐的……在下面的文本中,我不明白为什么它要查看地址的 2 个最低有效位?为什么?有人可以给我一个例子来澄清/说明这里的观点......所以它是说一个有效的半字地址都是其 2 个最低有效位是 00 或 10 吗?

那么如果我想从一个字对齐的内存中加载一个字节呢?我怎样才能做到这一点?据说我需要左移2,即使至少2个有效位为0 ...然后提取这些位...

替代文字 http://img69.imageshack.us/img69/1603/jpgdw.jpg

4

4 回答 4

1

“字对齐”意味着 CPU 将始终读取 4 个字节。

但是,如果操作实际上是在一个 2 字节的短字节上进行,则地址以 0b00 或 0b10 结尾是合法的(因此地址是偶数),并且 CPU 将在加载到寄存器时将正确的 2 个字节插入寄存器或写下正确的信息。

类似地,在读取一个字符时,两个最低有效位可以取任意值,正确的字节被加载到相关寄存器或寄存器的相关部分(通常是 LSB)被写入内存的正确部分。

但是,如果您尝试读取int地址不以 0b00 结尾的(4 字节),那么您将获得 SEGV 或附近。

于 2010-03-05T04:57:17.450 回答
0

半字对齐地址以二进制 0 结尾(可被十进制 2 整除,半字中的字节数)。字对齐地址以二进制 00 结尾(可被十进制 4 整除,即一个字中的字节数)。

是的,措辞和图表有点迟钝。

于 2010-03-05T04:54:09.207 回答
0

我记得在使用 MIPS 时遇到了这个问题。我的建议是首先加载整个单词,然后查看两个最低有效位并使用它们来确定您实际想要加载的 32 位中的哪 8 位。

问题,你到底想做什么?你在写 MIPS 汇编代码吗?或者您是否尝试在硬件中实现 MIPS 处理器?

如果您只是为 MIPS 编写汇编代码,我的理解是您可以将 lb 与任何内存地址一起使用,它会正确处理它。唯一需要担心正确对齐的时候是使用 lw 指令时。

于 2010-03-05T05:53:29.673 回答
0

如果要读取单个字节,可以从内存中的每个位置读取。没什么好担心的。仅当您想一次读取多个字节时,字对齐才起作用。

如果要读取跨越字边界的 4 字节值,可以使用 4 个单字节读取操作、移位和 ORing 来完成。它比简单的阅读要慢得多。

于 2010-03-07T13:37:17.493 回答