【问题标题】:understanding memory address理解内存地址
【发布时间】:2011-01-23 23:40:36
【问题描述】:

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

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

alt text http://img69.imageshack.us/img69/1603/jpgdw.jpg

【问题讨论】:

  • 如果我想从字对齐的内存中加载一个字节...我该怎么做呢?我的想法是首先提取具有我想要的字节的单词,然后从单词中提取字节......但是如何通过在 MIPS 中执行加载字节(lb)来获取单词的地址......

标签: memory assembly mips cpu-architecture


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    “字对齐”表示 CPU 将始终读取 4 个字节。

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

    同样,读取一个字符时,两个最低有效位可以取任意值,将正确的字节装入相关寄存器或将寄存器的相关部分(通常是LSB)写入正确的部分记忆。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-12-28
          • 2020-07-03
          • 1970-01-01
          • 1970-01-01
          • 2014-09-06
          • 1970-01-01
          • 2021-10-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多