为什么我们使用字节寻址而不是字寻址?

Why do we use byte addressing instead of word addressing?

所以我刚刚开始学习我的组织和体系结构 class,现在我们正在研究 MIPS 中的内存寻址。我刚读到内存是如何以字节为单位寻址的,这很好,因此当我们将一个字加载到寄存器时,我们必须使用 4 的倍数来访问内存,这也很好。

但是,让我感到困惑的是,如果我们最终加载到寄存器中的内容无论如何都必须是一个完整的单词,那么为什么我们甚至不厌其烦地允许自己访问单个单词中的字节。为什么我们不直接进行字寻址,省去乘以 4 的麻烦呢?我们可能想要获取单个字节有什么原因吗?

直到 70 年代,字寻址机器都非常流行。那时,你有用于商业数据处理的字节(一个字节有 5 到 10 位,具体取决于机器)机器(想想银行和保险公司),而科学机器是面向字的(一个字有 12 到 60 位)。

为什么会发生这种变化?如果你所能做的只是解决记忆中的单词,那么处理文本是相当困难的。为了不浪费内存,文字机器通常会在每个单词中存储一堆字符。要处理字符串,您不能只使用指针,因为字符串可以在单词的中间开始或结束。这需要一些相当复杂的编程来进行文本处理。

这在计算机用于算术而很少进行文本处理来读取输入和打印输出的时候还可以,但是随着交互式计算机的出现,文本处理变得越来越重要,完全将文字机器赶出了市场。

文字机在 DSP(数字信号处理器)等特殊应用中仍然很常见,但它们有一个明显的缺点,即如果不对编写程序的方式进行一些重大更改,就无法使用普通语言进行编程。

至于为什么 CPU 需要专用字节加载和存储的问题:它并不直接需要它们。例如,早期的 Alpha 处理器没有这些指令。如果你想加载一个字节,你会加载一个字并使用位移和屏蔽操作来获取你想要的字节。类似地,要存储一个字节,您可以获取一个字,屏蔽掉您想要的字节,或者在您要存储的字节中,然后将字写回内存。这有效,即使它比专用字节 load/store 指令慢一点。

但是,当您需要对内存进行原子操作时,就会出现问题。因为您需要加载然后存储才能将单个字节写入内存,所以写入一个字节不是原子操作。您可以通过提供加载 link/store 独占指令来解决此问题,但仅提供(原子)字节加载和存储会更容易,因为无论如何都经常需要这些。