字寻址与字节寻址的区别

29
可以有人解释一下什么是“字”和“字节”可寻址的区别吗?它与内存大小有什么关系?

2
请参见字节寻址方案与字寻址方案:>演示了基于字节和字的寻址方案。 - Andrew Hare
3个回答

43

内存单元可寻址的。这是我们使用内存的唯一方式。

实际上,内存只有按字节寻址。这意味着:

  • 二进制地址总是指向一个字节
  • 只是字节的组合-2, 4, 8取决于CPU的数据总线大小

为了完全理解memory operation,您必须熟悉CPU的各种寄存器和RAM的内存端口。我假设您知道它们的含义:
  • MAR(内存地址寄存器)
  • MDR(内存数据寄存器)
  • PC(程序计数器寄存器)
  • MBR(内存缓冲区寄存器)

RAM两种 类型的 内存端口

  1. 32位 用于数据/地址
  2. 8位 用于 操作码

假设CPU想要从地址xyz开始读取一个字(比如4个字节)。CPU会将地址放在MAR上,向内存控制芯片发送一个内存读取信号。收到地址和读取信号后,内存控制器会将数据总线连接到32位端口,并从地址xyz开始的4个字节流出端口到MDR。
如果CPU想要获取下一条指令,它会将地址放到PC寄存器中,并向内存控制器发送一个取指令信号。收到地址和取指令信号后,内存控制器会将数据总线连接到8位端口,并且位于接收到的地址处的单字节长操作码将从RAM流出到CPU的MDR中。
那么,当我们说某个寄存器内存寻址字节寻址时,意味着什么呢?现在如果您把例如十进制 2二进制放到MAR上,意图读取单词2而不是(第二个字节,会发生什么情况呢? 第二个表示32位机器中的4567 字节。在真正的物理内存中,只能进行字节寻址。因此有一个技巧来处理字寻址
MAR 放置在 地址总线 上时,它的 32 位并不映射到 32地址线(分别是 0-31)。相反,MAR0 位被连线到 地址总线2 号线,MAR1 位被连线到地址总线的 3 号线,以此类推。由于上面的 2 位仅用于超过 2^32字地址,而这些地址都不适用于我们的 32 位 机器,因此将其丢弃。
利用这种映射,当 MAR1 时,将 地址4 放置在 总线 上,当 MAR2 时,将 地址8 放置在 总线 上,以此类推。
在一开始可能有点难理解。我是从 Andrew Tanenbaum结构化计算机组成 中学到的。

1
根据我的理解,你的答案是说CPU中应该有某种电路来决定内存操作是针对一个字节还是一个字,特别是当数据返回到MDR时,例如只读取32位数据总线的第一个字节。但我怀疑这是否是正确的假设? - stdout

10
这张图片可以很容易地理解:http://i.stack.imgur.com/rpB7N.png 简单来说,
• 在字节寻址方案中,第一个单词从地址0开始,第二个单词从地址4开始。
• 在字寻址方案中,第一个单词的所有字节都位于地址0中,第二个单词的所有字节都位于地址1中。
字节寻址的优点在于考虑到以一个字节为单位处理数据的应用程序。访问字节寻址系统中的单个字节只需要发出一个地址。在16位字寻址系统中,必须先计算包含该字节的字的地址,然后提取该字节。尽管字节提取过程已经被充分理解,但它们比直接访问字节要低效。因此,许多现代机器都是字节可寻址的。

4
地址可寻性是具有自己地址的内存单元的大小。它也是您可以修改而不影响其邻居的最小内存块。
例如:一个字节为常规8位,字长为4个字节的机器。如果它是一个字寻址的机器,不存在int的第二个字节的地址。处理字符串(例如像char str[]这样的数组)变得不方便,因为您仍然将字符紧密地存储在一起。仅修改str[1]意味着加载包含它的字,进行一些移位/和/或操作以应用更改,然后进行字存储。
请注意,这与不允许非对齐字加载/存储(其中字地址的低2位必须为0)的机器不同。这样的机器通常具有字节加载/存储指令。我们正在谈论甚至没有这些指令的机器。
CPU地址可能仍然包括低位,但需要将它们始终设置为零(或忽略它们)。但是,在检查它们是否为零后,可以丢弃它们,因此内存系统的其余部分只看到字地址,其中两个相邻的字的地址相差1(而不是4)。但是,在一个16位CPU上,一个寄存器只能容纳64k个不同的地址,您不太可能这样做。每个单独的CPU地址将引用内存的不同2个字节,而不是丢弃低位。2B字可寻址内存可以让您寻址128kiB的内存,而不仅仅是64kiB的字节可寻址内存。
有趣的事实:ARM曾经使用地址的低2位作为对未对齐的字加载的洗牌控制。(但它始终具有字节加载/存储指令。)

参见:


请注意,位可寻址内存可能存在,但实际上并不存在。现在几乎普遍采用8位字节标准。(古老的计算机有时会使用更大的字节,请参阅wikipedia's Byte article的历史部分。)

请注意,char str[] 的示例假定 CHAR_BIT == 8,即使在字寻址机器上也是如此。但实际的 C 实现很可能定义 CHAR_BIT == 32。(如果支持线程,则 C11 将要求这样做:写入一个 char 数组元素不得对包含单词的非原子 RMW 进行操作,因为这可能会引入源中不存在的数据竞争。)我的理解是一些现代 DSP 仍然是字寻址的。(但我五年前不知道。) - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接