【问题标题】:do registers and memory have the same address length in bits?寄存器和内存是否具有相同的位地址长度?
【发布时间】:2021-11-16 16:05:00
【问题描述】:

我对计算机组织和系统还很陌生,所以如果我说错了,我提前道歉。 我正在学习 MIPS 架构,但我有很多关于内存和寻址的问题:

  1. 到目前为止,我所知道的是,当我们拥有 32 位 CPU 时,这意味着我们以 32 位块的形式处理数据。 CPU 由 ALU 和由 32 个寄存器组成的高速缓存组成。存储器存储 32 位长的指令。我将内存可视化的方式是,它是一个多行矩形,每行 32 位长。
  2. 现在,我的问题与我们如何寻址寄存器和内存有关。当我们使用加载字或存储字命令时,我们调用某些内存位置以便在其中存储数据,或者将存储在其中的数据传输到缓存中的寄存器中。我遇到过诸如 $t0、$s0 等术语,我假设它们是某些类型寄存器的绰号。 我的问题是 - 内存地址以位为单位有多长?例如,如果我们要访问存储在内存第 1 行的数据,那么第 1 行的“地址”有多长?我在某处读到地址本身是 32 位长,而这个 32 位地址又指的是 32 位长的数据。这是否意味着有 2^32 个可能的地址或内存行,每个地址存储 32 位数据?
  3. 现在如果上述情况属实,我假设寄存器也有 32 位长的地址,但后来我意识到在 MIPS 中只有 32 个寄存器,这意味着每个寄存器地址是 5 位长,每个 5位地址指向 32 位长数据。那么,寄存器地址和内存地址的长度是否不同,即分别为 5 位和 32 位?
  4. 我最后的困惑与字节可寻址性和字可寻址性之间的区别有关。如果数据是字节可寻址的,这意味着每个字节都有自己的地址。这是否意味着我之前提到的 2^32 个内存位置指向 8 位长而不是 32 位长的数据?同样,在寄存器的情况下,32 个寄存器的每个字节是否都有自己的地址?这意味着每个字节有 4*32 个唯一地址?在这种情况下,它与 5 位用于存储地址的事实相矛盾。 如您所见,我非常困惑,希望能得到所有帮助。

【问题讨论】:

  • 我们基本上不在软件中寻址寄存器。我们可以在指令中命名寄存器,但没有简单的引用寄存器的变量的概念可以轻松地在软件中获取寄存器的值。而使用内存我们可以进行寻址:我们可以有一个变量来保存对内存的引用(称为指针),并使用这些变量轻松访问它们所引用的内存(使用加载和存储)。因此,我们在指令中命名寄存器,但我们不会将它们索引为数组或内存。
  • 要了解寄存器,我们查看指令的字段,例如在 R-Type 指令中,指定了三个寄存器,每个寄存器使用 5 位字段。虽然内存是小端或大端(字节可寻址),但我们无法判断 32 位寄存器是大端还是小端,因为我们只能在指令中命名(整个)寄存器(否则无法访问它们,例如通过某种方式)参考)。

标签: memory mips cpu-architecture memory-address cpu-registers


【解决方案1】:

寄存器 只能字寻址(5 位寄存器编号嵌入在指令字中)。并且寄存器编号是与内存分开的地址空间。您无法通过lwsw 对 MIPS 上的寄存器文件进行索引(与少数 8 位微控制器(例如具有内存映射寄存器文件的 AVR)不同)。

内存 是字节可寻址的,因此每个字节都有 1 个唯一地址。 MIPS32内存地址是32位宽的,是$t0这样的寄存器的宽度,所以它的地址空间包括2^32字节= 4 GiB。

MIPS 上的字加载跨越 4 个字节。例如来自地址0x1000 的加载获取0x100[0..3] 处的字节。如果您允许未对齐字加载(例如with a lwl/lwr pair),则有 4 个不同的未对齐字起始地址与每个字节重叠。 (This recent answer 更详细地介绍了 MIPS lw / ARM ldr 从 4 个单独的字节作为单个字加载。)

【讨论】:

  • 谢谢,这澄清了很多事情。我刚刚有一个后续问题(对不起,我对此很陌生,所以我对某些术语不太熟悉)- 地址空间一词到底是什么意思?它在哪里?它是如何存储的? 0x1000 是一个字节的内存地址吗?而 lw 命令从这个 0x1000 地址开始检索 4 个字节?
  • @anonimousse:0x1000 是一个地址。它并不意味着您可以对该地址执行什么大小的加载或存储。就像在 C 中一样,您可以使用 *(char*) &my_int 来访问 int 的第一个字节 (char)。是的,就像我在回答中所说的那样,MIPS“单词”是 4 个字节;如果您不确定,MIPS 指令集手册应该解释 lw(加载字)的作用。
  • 至于“地址空间”,它不是“存储”在任何地方,而是理论上可以使用的一组地址。可能没有 RAM(或分配的虚拟内存)支持任何给定地址。你有没有用谷歌搜索你不确定的术语? en.wikipedia.org/wiki/Address_space 看起来对这个概念有一个不错的初学者友好介绍,虽然我只是看了一眼。
猜你喜欢
  • 2018-10-22
  • 2019-06-20
  • 2014-04-02
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多