我在MIPS中遇到内存寻址问题。它说地址是字对齐的...在下面的文字中我不明白为什么它会查看地址的2个最低有效位?为什么?谁能给我一个例子来澄清/说明这里提出的观点...那么它是说有效的半字地址都是2个最低有效位是00还是10?
那么如果我想从一个字对齐的内存中加载一个字节呢?我怎样才能做到这一点?据说我需要向左移2,即将最少2位有效位0 ...然后提取位......
答案 0 :(得分:1)
'字对齐'表示CPU将始终读取4个字节。
但是,如果操作实际上是2字节短路,那么地址结束为0b00或0b10(因此地址是偶数)是合法的,并且当加载到CPU时,CPU会将正确的2个字节戳入寄存器注册或写出正确的信息。
类似地,当读取字符时,两个最低有效位可以取任何值,并且正确的字节被加载到相关寄存器中,或者寄存器的相关部分(通常是LSB)被写入到正确的部分。存储器中。
但是,如果您尝试读取地址不是0b00的(4字节)int
,那么您将获得一个SEGV或其附近。
答案 1 :(得分:0)
半字对齐的地址以二进制0结束(可被十进制2整除,即半字中的字节数)。字对齐的地址以二进制00结尾(可被十进制4整除,即字中的字节数)。
是的,措辞和图表有点迟钝。
答案 2 :(得分:0)
我记得在使用MIPS时遇到此问题。我的建议是首先加载整个单词,然后查看两个最低有效位并使用它们来确定实际要加载的32位中的哪8位。
问题,您究竟想要做什么?你在写MIPS汇编代码吗?或者您是否尝试在硬件中实施MIPS处理器?
如果您只是为MIPS编写汇编代码,我的理解是您可以将lb与任何内存地址一起使用,它将正确处理它。您需要担心正确对齐的唯一时间是使用lw指令。
答案 3 :(得分:0)
如果要读取单个字节,可以从内存中的每个位置读取。没什么好担心的。当您想要一次读取多个字节时,单词对齐仅起作用。
如果要读取跨越字边界的4字节值,可以使用4个单字节读取操作,移位和ORing来完成。它比简单阅读要慢得多。