【发布时间】:2021-11-16 16:05:00
【问题描述】:
我对计算机组织和系统还很陌生,所以如果我说错了,我提前道歉。 我正在学习 MIPS 架构,但我有很多关于内存和寻址的问题:
- 到目前为止,我所知道的是,当我们拥有 32 位 CPU 时,这意味着我们以 32 位块的形式处理数据。 CPU 由 ALU 和由 32 个寄存器组成的高速缓存组成。存储器存储 32 位长的指令。我将内存可视化的方式是,它是一个多行矩形,每行 32 位长。
- 现在,我的问题与我们如何寻址寄存器和内存有关。当我们使用加载字或存储字命令时,我们调用某些内存位置以便在其中存储数据,或者将存储在其中的数据传输到缓存中的寄存器中。我遇到过诸如 $t0、$s0 等术语,我假设它们是某些类型寄存器的绰号。 我的问题是 - 内存地址以位为单位有多长?例如,如果我们要访问存储在内存第 1 行的数据,那么第 1 行的“地址”有多长?我在某处读到地址本身是 32 位长,而这个 32 位地址又指的是 32 位长的数据。这是否意味着有 2^32 个可能的地址或内存行,每个地址存储 32 位数据?
- 现在如果上述情况属实,我假设寄存器也有 32 位长的地址,但后来我意识到在 MIPS 中只有 32 个寄存器,这意味着每个寄存器地址是 5 位长,每个 5位地址指向 32 位长数据。那么,寄存器地址和内存地址的长度是否不同,即分别为 5 位和 32 位?
- 我最后的困惑与字节可寻址性和字可寻址性之间的区别有关。如果数据是字节可寻址的,这意味着每个字节都有自己的地址。这是否意味着我之前提到的 2^32 个内存位置指向 8 位长而不是 32 位长的数据?同样,在寄存器的情况下,32 个寄存器的每个字节是否都有自己的地址?这意味着每个字节有 4*32 个唯一地址?在这种情况下,它与 5 位用于存储地址的事实相矛盾。 如您所见,我非常困惑,希望能得到所有帮助。
【问题讨论】:
-
我们基本上不在软件中寻址寄存器。我们可以在指令中命名寄存器,但没有简单的引用寄存器的变量的概念可以轻松地在软件中获取寄存器的值。而使用内存我们可以进行寻址:我们可以有一个变量来保存对内存的引用(称为指针),并使用这些变量轻松访问它们所引用的内存(使用加载和存储)。因此,我们在指令中命名寄存器,但我们不会将它们索引为数组或内存。
-
要了解寄存器,我们查看指令的字段,例如在 R-Type 指令中,指定了三个寄存器,每个寄存器使用 5 位字段。虽然内存是小端或大端(字节可寻址),但我们无法判断 32 位寄存器是大端还是小端,因为我们只能在指令中命名(整个)寄存器(否则无法访问它们,例如通过某种方式)参考)。
标签: memory mips cpu-architecture memory-address cpu-registers