Memory 理解内存地址
我在MIPS中遇到内存寻址问题。它说地址是单词对齐的。。。在下面的文本中,我不明白为什么它要查看地址的2个最低有效位?为什么?有人能给我举个例子来澄清/说明这里提出的观点吗。。。那么,是不是说一个有效的半字地址都是其2个最低有效位为00或10的地址Memory 理解内存地址,memory,assembly,mips,cpu-architecture,Memory,Assembly,Mips,Cpu Architecture,我在MIPS中遇到内存寻址问题。它说地址是单词对齐的。。。在下面的文本中,我不明白为什么它要查看地址的2个最低有效位?为什么?有人能给我举个例子来澄清/说明这里提出的观点吗。。。那么,是不是说一个有效的半字地址都是其2个最低有效位为00或10的地址 那么,如果我想从一个字对齐的内存中加载一个字节呢??我该怎么做?据说我需要向左移位2,即使至少2个有效位为0。。。然后提取这些位 半字对齐地址以二进制0结尾(可被十进制2整除,即半字中的字节数)。字对齐地址以二进制00结尾(可被十进制4整除,即字中的
那么,如果我想从一个字对齐的内存中加载一个字节呢??我该怎么做?据说我需要向左移位2,即使至少2个有效位为0。。。然后提取这些位
半字对齐地址以二进制0结尾(可被十进制2整除,即半字中的字节数)。字对齐地址以二进制00结尾(可被十进制4整除,即字中的字节数)
是的,措辞和图表有点迟钝。半字对齐的地址以二进制0结尾(可被十进制2整除,半字中的字节数)。字对齐地址以二进制00结尾(可被十进制4整除,即字中的字节数)
是的,文字和图表有点迟钝。“字对齐”意味着CPU将始终读取4个字节 但是,如果操作实际上是2字节短的,则地址以0b00或0b10结尾是合法的(因此地址是偶数),CPU将在加载到寄存器或写入正确信息时将正确的2字节插入寄存器 类似地,在读取字符时,两个最低有效位可以取任何值,并且正确的字节被加载到相关寄存器中,或者寄存器的相关部分(通常是LSB)被写入内存的正确部分
但是,如果您尝试读取地址不以0b00结尾的(4字节)int
int
,则您将获得一个SEGV或其附近的值。“字对齐”意味着CPU将始终读取4个字节
但是,如果操作实际上是2字节短的,则地址以0b00或0b10结尾是合法的(因此地址是偶数),CPU将在加载到寄存器或写入正确信息时将正确的2字节插入寄存器
类似地,在读取字符时,两个最低有效位可以取任何值,并且正确的字节被加载到相关寄存器中,或者寄存器的相关部分(通常是LSB)被写入内存的正确部分
但是,如果您试图读取地址不以0b00结尾的(4字节)int
int
,那么您将得到一个SEGV或其左右的值。我记得在使用MIPS时遇到过这个问题。我的建议是首先加载整个单词,然后查看两个最低有效位,并使用它们确定32位中实际要加载的8位
问题,你到底想做什么?您正在编写MIPS汇编代码吗?或者您正在尝试在硬件中实现MIPS处理器
如果您只是为MIPS编写汇编代码,我的理解是,您可以将lb与任何内存地址一起使用,并且它将正确处理它。唯一需要担心正确对齐的时候是使用lw指令。我记得在使用MIPS时遇到过这个问题。我的建议是首先加载整个单词,然后查看两个最低有效位,并使用它们确定32位中实际要加载的8位 问题,你到底想做什么?您正在编写MIPS汇编代码吗?或者您正在尝试在硬件中实现MIPS处理器
如果您只是为MIPS编写汇编代码,我的理解是,您可以将lb与任何内存地址一起使用,并且它将正确处理它。唯一需要担心正确对齐的时候是使用lw指令。如果要读取单个字节,可以从内存中的每个位置读取。没什么好担心的。单词对齐仅在您希望一次读取多个字节时起作用
如果要读取跨越字边界的4字节值,可以通过4个单字节读取操作、移位和ORing来完成。它比简单读取要慢得多。如果要读取单个字节,可以从内存中的每个位置读取。没什么好担心的。单词对齐仅在您希望一次读取多个字节时起作用
如果要读取跨越字边界的4字节值,可以通过4个单字节读取操作、移位和ORing来完成。它比简单读取慢得多。所以,如果我想从字对齐的内存中加载一个字节,该怎么办。。。我该怎么做?我的想法是先提取单词,它有我想要的字节,然后从单词中提取字节。。。但是,如何在MIPS中通过加载字节(lb)来获取单词的地址…因此,如果我想从单词对齐的内存中加载字节,该怎么办。。。我该怎么做?我的想法是先提取单词,它有我想要的字节,然后从单词中提取字节。。。然而,我怎样才能从MIPS中的加载字节(lb)中获得单词的地址。。。